从选定的 Unicode 希伯来语文本中删除希伯来语元音 (nikkud)

Jon*_*ter 5 regex unicode vba ms-word hebrew

我想在 Word 文档中选择一串 Unicode 希伯来语文本并删除希伯来语元音(又名 nikkud)而不更改任何其他内容。

我需要从所选文本中删除给定范围内的 Unicode 字符。我要删除的 Unicode 字符是 U+0591-U+05BD、U+05BF-U+05C2 和 U+05C4-U+05C7。

我找到了一种使用 Google 表格中的 REGEXREPLACE 函数从 Unicode 文本字符串中删除希伯来语元音的方法(谢谢 GitHub)。例如:

=REGEXREPLACE(B1,"[(\x{0591}-\x{05BD})OR(\x{05BF}-\x{05C2})OR(\x{05C4}-\x{05C7})]","")
Run Code Online (Sandbox Code Playgroud)

其中单元格 B1 包含带元音的原始希伯来语文本,该函数输出删除了元音的相同文本。那里使用的 Unicode 范围允许我留下两个需要保留的字符(U+05BE 和 U+05C3)。

使用该方法,我可以复制希伯来语文本字符串,例如,????? ??????,将其粘贴到我的 Google Sheet 中,然后复制输出,??? ????,并将其粘贴到原始文本上。这比 Word 中的宏慢得多(有数百个希伯来语文本字符串需要修复)。大部分文档是英文的,有希伯来语的片段,所以我不需要转换整个文档的解决方案。

一些搜索向我表明 Word VBA 存在类似的 RegEx 替换函数,但我没有足够的编程知识来适应我自己的需要。

Jon*_*ter 1

感谢大家。基于其中的一些建议,我整理了以下宏,它似乎工作得很好。可能有一种更优雅的方式来编写这个(wp78de似乎更统一,但它对我不起作用)。

Sub HebrewDevocalizer()
With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[" & ChrW(1425) & "-" & ChrW(1469) & "]"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchKashida = False
    .MatchDiacritics = False
    .MatchAlefHamza = False
    .MatchControl = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[" & ChrW(1471) & "-" & ChrW(1474) & "]"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchKashida = False
    .MatchDiacritics = False
    .MatchAlefHamza = False
    .MatchControl = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll

With Selection.Find
    .ClearFormatting
    .Replacement.ClearFormatting
    .Text = "[" & ChrW(1476) & "-" & ChrW(1479) & "]"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindStop
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchKashida = False
    .MatchDiacritics = False
    .MatchAlefHamza = False
    .MatchControl = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
End Sub
Run Code Online (Sandbox Code Playgroud)