Regex с гиперссылками ActiveDocument.Range и Format - PullRequest
0 голосов
/ 23 мая 2018

Я видел несколько других сообщений StackOverflow, таких как этот: Как использовать / Включить (объект RegExp) Регулярное выражение с использованием VBA (MACRO) в слове при использовании регулярных выражений в Microsoft Word с VBA с использованиемСценарий Microsoft VB Регулярные выражения 5.5 Справочник.

Это помогло мне подготовить следующее, которое я использую в Word для выделения сумм в долларах США:

Sub dollarHighlighter()
Set regExp = New regExp
Dim objMatch As Match
Dim colMatches As MatchCollection
Dim offsetStart As Long
offsetStart = Selection.Start
regExp.Pattern = "\$([\,\d{1,3}]*(?:\.\d{2})?)"
regExp.Global = True
Set colMatches = regExp.Execute(Selection.Text)   ' Execute search.
For Each objMatch In colMatches   ' Iterate Matches collection.
  Set myRange = ActiveDocument.Range(objMatch.FirstIndex + offsetStart, 
    End:=offsetStart + objMatch.FirstIndex + objMatch.Length)
  myRange.FormattedText.HighlightColorIndex = wdYellow
Next
   End Sub

Хотя это работает, как ожидается, в спискедолларовые суммы в тексте (по большей части - среди своих недостатков, регулярное выражение намеренно немного ослаблено ), оно не работает, как ожидалось, когда в документе Word присутствуют гиперссылки.

Вв этом случае, по-видимому, происходит смещение смещенных выделенных символов несколько непредсказуемым образом.Я предполагаю, что это связано с тем, что в исходном файле document.xml много нового xml / css.

В конечном счете, мои общие вопросы: могу ли я использовать регулярные выражения для выделения содержимого документа Word, даже если он содержит гиперссылки?Это вопрос смещения или я должен запустить регулярное выражение для сжатого XML, повторно сжать и снова открыть для лучших результатов?Как и при тестировании различных вариантов регулярных выражений в исходном коде, я получаю ожидаемые результаты, но не при форматировании того, что было бы диапазоном Word.

Я также спрашивал это здесь: https://social.msdn.microsoft.com/Forums/en-US/3a95c5e4-9e0c-4da9-970f-e0bf801c3170/macro-for-a-regexp-search-replace?forum=isvvba&prof=required, но понимаюэто был древний пост ...

По вопросу ниже, вот некоторые, возможно, полезные ссылки: пример документа http://www.smithany.com/test.docx шаг 1 http://www.smithany.com/wordusd1.jpg шаг 2 http://www.smithany.com/wordhighlighterrun.jpgи что происходит http://www.smithany.com/whatactuallyhappens.jpg

Временное решение: Как указано ниже, подстановочный знак Word быстро находит, если вы не сложите циклы.попробуйте это:

Sub Macro2()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.highlight = True
With Selection.Find
    .Text = "$[0-9,]{1,}"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.highlight = True
With Selection.Find
    .Text = "$[0-9,]{1,}.[0-9]{2,3}"
    .Replacement.Text = ""
    .Forward = True
    .Wrap = wdFindContinue
    .Format = True
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
End With
Selection.Find.Execute Replace:=wdReplaceAll

End Sub

, который в основном подсвечивает все суммы в долларах.Тем не менее, сложные выражения, такие как сопоставление различных форматов дат, могут стать грязными, но я полагаю, что все это возможно, если выполнять их по одному шагу за раз.

1 Ответ

0 голосов
/ 23 мая 2018

Я годами не общался с VBA, но, наверное, это как езда на велосипеде.

В любом случае, здесь есть подпункт, который должен вам помочь.Он основан на рекомендациях по звуку Синди Мейстер и заполняет пробел между Regex и Wildcard Find, используя набор шаблонов совпадений для дополнительных деталей.

Во-первых, подстановочные знаки совпадают: $[0-9,]{1,} и $[0-9,]{1,}.[0-9]{2}

В конце концов, не так ли это, не так ли?Однако, чтобы принять во внимание необязательную дробную часть, я должен использовать два шаблона:

И вот процедура:

Sub WildcardsHighlightWords()
    Dim Word As Range
    Dim WildcardCollection(2) As String
    Dim Words As Variant
    WildcardCollection(0) = "$[0-9,]{1,}"
    WildcardCollection(1) = "$[0-9,]{1,}.[0-9]{2}"
    Options.DefaultHighlightColorIndex = wdYellow
    'Clear existing formatting and settings in Find
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    'Set highlight to replace setting.
    Selection.Find.Replacement.Highlight = True
    'Cycle through document and find wildcards patterns, highlight words 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 = True
                .MatchCase = False
                .MatchWholeWord = False
                .MatchWildcards = True
                .MatchSoundsLike = False
                .MatchAllWordForms = False
            End With
            Selection.Find.Execute Replace:=wdReplaceAll
        Next
    Next
End Sub

Этот подход должен быть прост в расширении или изменении, если это необходимо.

Это подсвечивает суммы в долларах на моем конце:

enter image description here

Примечание: разделитель в квантификаторе {n ,m} не одинаков во всех локализациях, например, {n ; m} в немецкой версии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...