Word宏从选定的Unicode希伯来文

时间:2018-06-13 02:03:25

标签: regex unicode ms-word word-vba hebrew

这就是我想要做的事情:在现有Word文档中选择一串Unicode希伯来文本,并使用Word中的宏删除希伯来元音(又名nikkud),而不更改任何其他内容。基本上我只需要一个宏来删除所选文本中给定范围内的任何Unicode字符。我要删除的Unicode字符是U + 0591-U + 05BD,U + 05BF-U + 05C2和U + 05C4-U + 05C7。这可能吗?

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

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

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

使用该方法,我可以复制一个希伯来语文本字符串,例如,אָמַריְהוָה,将其粘贴到我的Google表格中,然后复制输出,אמריהוה,并将其粘贴到原始文本上。这样可以正常工作,但它比Word中的宏权要慢得多(有数百个希伯来语文本字符串需要修复)。大部分文档都是英文版,带有希伯来语片段,所以我不需要转换整个文档的解决方案。

有人可以建议用宏来完成这个吗?一些搜索告诉我,Word VBA存在类似的RegEx替换函数,但是我没有足够的编程知识来适应我自己的需要。感谢您的任何建议。

4 个答案:

答案 0 :(得分:2)

您可以尝试使用此宏。请注意,我的结果很慢:

Sub RemoveHebrewVowels()
    Dim Word As Range
    Dim Words As Variant
    Dim WildcardCollection(3) As String
    Rem [(\x{0591}-\x{05BD}]
    WildcardCollection(0) = "[" & ChrW(1425) & "-" & ChrW(1469) & "]{1;}"
    Rem [\x{05BF}-\x{05C2}]
    WildcardCollection(1) = "[" & ChrW(1471) & "-" & ChrW(1474) & "]{1;}"
    Rem [\x{05C4}-\x{05C7}]
    WildcardCollection(2) = "[" & ChrW(1476) & "-" & ChrW(1479) & "]{1;}"
    'Options.DefaultHighlightColorIndex = wdYellow
    'Clear existing formatting and settings in Find
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    'Selection.Find.Replacement.Highlight = True
    'Cycle through document and find wildcards patterns, replace when found
    For Each Word In ActiveDocument.Words
        For Each WildcardsPattern In WildcardCollection
            With Selection.Find
                .Text = WildcardsPattern
                .Replacement.Text = ""
                .Forward = True
                .Wrap = wdFindContinue
                .Format = False
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = True
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
            Selection.Find.Execute Replace:=wdReplaceAll
        Next
    Next
End Sub

答案 1 :(得分:1)

您可以安装notepad++并在粘贴整个输入后使用正则表达式模式(使用此正则表达式[\x{0591}-\x{05BD}\x{05BF}-\x{05C2}\x{05C4}-\x{05C7}])执行查找和替换操作。

<强>之前:

before

<强>后:

after

然后,您可以使用AutoHotkey自动执行复制/粘贴操作,例如

如果您想保留格式信息,这既不是问题。

只需执行以下操作:

  • 将文件保存在Word XML文档中(另存为&gt;另存为类型:Word XML Document (*.xml)
  • 获取此文件的副本并使用Notepad++打开它(您要么获取该文件的副本,要么关闭Word,否则您无法以写入模式打开它)
  • 应用说明开头所述的查找和替换并保存文件。
  • 使用Word重新打开文件并将其保存为.docx,例如

答案 2 :(得分:1)

谢谢大家。基于其中一些建议,我将以下宏放在一起,这似乎完美无缺。可能有更优雅的方式来写这个(wp78de&#39; s macro似乎更加巩固,但它对我来说并不起作用)。

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

答案 3 :(得分:0)

任何需要在软件脚本(Python 3)中使用它的人,您都可以这样做

import re
re.sub(r'[\u0591-\u05BD\u05BF-\u05C2\u05C4-\u05C7]', '', 'אֱלֹהִים')