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 替换函数,但我没有足够的编程知识来适应我自己的需要。
感谢大家。基于其中的一些建议,我整理了以下宏,它似乎工作得很好。可能有一种更优雅的方式来编写这个(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)