Макрос Word для удаления гласных иврита (никкуд) из выбранного текста на иврите - PullRequest
0 голосов
/ 13 июня 2018

Вот что я хочу сделать: выделите строку текста на иврите в Юникоде в существующем документе Word и используйте макрос в Word для удаления гласных на иврите (он же никкуд), не меняя ничего другого.По сути, мне просто нужен макрос, который удалит все символы Юникода в заданном диапазоне из выделенного текста.Символы Unicode, которые я хочу удалить, это U + 0591-U + 05BD, U + 05BF-U + 05C2 и U + 05C4-U + 05C7.Это возможно?

Я нашел способ удалить ивритские гласные из текстовой строки Unicode, используя функцию REGEXREPLACE в Google Sheets ( спасибо GitHub ).Например:

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

, где ячейка B1 содержит исходный текст на иврите с гласными, а функция выводит идентичный текст с удаленными гласными.Используемый там диапазон Юникода позволяет мне оставить два символа, которые должны остаться (U + 05BE и U + 05C3).

Используя этот метод, я могу скопировать текстовую строку на иврите, например, אָמַר יְהוָה, вставить ее в свой лист Google, а затем скопировать вывод אמר יהוה и вставить ее в исходный текст.Это прекрасно работает, но намного медленнее, чем макрос в Word (есть сотни текстовых строк на иврите, которые нужно исправить).Большая часть документа на английском языке, с фрагментами иврита, поэтому мне не нужно решение для конвертации всего документа.

Может кто-нибудь предложить макрос для достижения этой цели?Немного поиска подсказывает мне, что аналогичная функция замены RegEx существует для Word VBA, но у меня нет достаточных знаний в области программирования, чтобы приспособить это к моим собственным потребностям.Спасибо за любые ваши предложения.

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

Вы можете попробовать этот макрос.Будьте предупреждены, это очень медленно с моей стороны:

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
0 голосов
/ 15 июня 2018

Спасибо всем.Основываясь на некоторых из этих предложений, я собрал следующий макрос, который, кажется, работает отлично.Может быть более элегантный способ написать это ( wp78de ' 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
0 голосов
/ 13 июня 2018

Вы можете установить notepad++ и выполнить операцию поиска и замены в режиме регулярных выражений (используя это регулярное выражение [\x{0591}-\x{05BD}\x{05BF}-\x{05C2}\x{05C4}-\x{05C7}]) после вставки всего введенного вами значения.

До:

before

После:

after

Затем вы можете автоматизировать операцию копирования / вставки, используя AutoHotkey, например,

. Если вы хотите сохранить информацию о форматировании, это тоже не проблема.

Просто выполните следующие операции:

  • Сохраните ваш файл в документе Word XML (Сохранить как> Сохранить как тип: Word XML Document (*.xml)
  • Возьмите копию этогофайл и откройте его с помощью Notepad++ (вам нужно либо взять копию файла, либо закрыть Word, в противном случае вы не сможете открыть его в режиме записи)
  • Примените поиск и замену, описанные в началеобъяснения и сохраните файл.
  • Снова откройте файл с помощью Word и сохраните его .docx, например
...