VBA 6: регулярное выражение не распознает сложную строку - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть эта строка "1X214X942,0SX", где каждый X представляет "неразрывный пробел" (точный пробел) с кодом ASCII 160, а S представляет символ пробела.

Я пытаюсьраспознать его с помощью этого регулярного выражения:

(\d{1,3}\s(\d{3}\s)*\d{3}(\,\d{1,3})?|\d{1,3}\,\d{1,3})

, но оно не работает, так как этот пробел не распознается и выражение только перехватывает 942,0.

Я пытался увидеть,RegExr может перехватить всю строку и может (http://gskinner.com/RegExr/?2v8ic), значит, что-то не так с моим VBA?

Пожалуйста, сообщите!

Вот мой код:

Sub ChangeNumberFromFRformatToENformat()

Dim SectionText As String
Dim RegEx As Object, RegC As Object, RegM As Object
Dim i As Integer


Set RegEx = CreateObject("vbscript.regexp")
With RegEx
    .Global = True
    .MultiLine = False
    .Pattern = "(\d{1,3}\s(\d{3}\s)*\d{3}(\,\d{1,3})?|\d{1,3}\,\d{1,3})"
End With

For i = 1 To ActiveDocument.Sections.Count()

    SectionText = ActiveDocument.Sections(i).Range.Text

    If RegEx.test(SectionText) Then
        Set RegC = RegEx.Execute(SectionText)

        For Each RegM In RegC

            Call ChangeThousandAndDecimalSeparator(RegM.Value)

        Next 'For Each RegM In RegC

        Set RegC = Nothing
        Set RegM = Nothing

    End If

Next 'For i = 6 To ActiveDocument.Sections.Count()

Set RegEx = Nothing

End Sub

Ответы [ 2 ]

4 голосов
/ 14 декабря 2011

Последовательность \s не соответствует неразрывному пробелу, однако есть способы сделать это. Атомы, которые вы хотите использовать в регулярном выражении: \xnn или \nnn - они соответствуют символу по шестнадцатеричному или восьмеричному значению.

Таким образом, чтобы соответствовать неразрывному пробелу ASCII 160, укажите один из \xA0 или \240 вместо \s.

1 голос
/ 14 декабря 2011

Проблема в том, что \s не содержит неразрывного пробела в реализации VBScript.RegExp.

Попробуйте вместо этого:

With RegEx
    .Global = True
    .MultiLine = False
    .Pattern = "(\d{1,3}X(\d{3}X)*\d{3}(,\d{1,3})?|\d{1,3},\d{1,3})"
    .Pattern = Replace(.Pattern, "X", "[\s" & Chr(160) & "]")
End With

Шаблоны регулярных выражений соответствуют буквенным символам, которые вы вставили в них, даже неразрывному пробелу. Единственный способ добавить неразрывный пробел в строку VB - создать ее с помощью Chr().

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