Распознавать числа во французском формате внутри документа с помощью регулярных выражений - PullRequest
0 голосов
/ 21 ноября 2011

У меня есть документ, содержащий цифры в различных форматах, французском, английском, пользовательских форматах.

Я хотел, чтобы регулярное выражение могло ловить ТОЛЬКО числа во французском формате.

Это полный список чисел, которые я хочу поймать (d представляет цифру, десятичный разделитель - запятая ,, а разделитель тысяч - пробел)

d,d d,dd   d,ddd

dd,d   dd,dd   dd,ddd

ddd,d   ddd,dd   ddd,ddd

d ddd,d   d ddd,dd   d ddd,ddd

dd ddd,d  dd ddd,dd  dd ddd,ddd

ddd ddd,d  ddd ddd,dd  ddd ddd,ddd

d ddd ddd,d...

dd ddd ddd,d...

ddd ddd ddd,d...

Это регулярное выражение, которое у меня есть

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

перехватывает французские форматы, как указано выше, поэтому я на правильном пути, но также и числа вроде d,ddd.dd (потому что он ловит d,ddd) или d,ddd,ddd (потому что он ловит d,ddd).

Что я должен добавить к своему регулярному выражению?

Код 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})"
    ' regular expression used for the macro to recognise FR formated numners
    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)
        ' RegC regular expresion matches collection, holding french format numbers

        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

Пользователь Stema, дал мне хорошее решение. Регулярное выражение должно быть:

* +1025 * (<= ^ | \ с?) \ Д {1,3}: * (: \, \ д {1,3}?) ((\ S \ d {3}?)? = \ s | $) </strong> Но VBA жалуется, что регулярное выражение содержит неэкранированные символы. Я нашел здесь один (?: \ D {3}) между (?: \ D {3}), который является пустым символом, поэтому я могу заменить его на \ s. Второе, я думаю, здесь (?:, \ D {1,3}) между?: И \ d, символом запятой, и если я убегу, это будет \,. Итак, регулярное выражение теперь (? <= ^ | \ S) \ d {1,3} (?: \ S \ d {3}) * (?: \, \ D {1,3})? (? = \ s | $), и он отлично работает в RegExr, но мой код VBA не примет его. </p> НОВАЯ ЛИНИЯ В ПОЧТЕ: Я только что обнаружил, что VBA не согласен с этой последовательностью регулярного выражения ? <= ^ </strong>

Ответы [ 2 ]

2 голосов
/ 21 ноября 2011

Что насчет этого?

\b\d{1,3}(?: \d{3})*(?:,\d{1,3})?\b

Посмотрите на это здесь, в Regexr

\b - границы слов

Сначала (\d{1,3}) соответствует 1–3 цифрам, тогда может быть 0 или более групп начального пробела, за которыми следуют 3 цифры ((?: \d{3})*) и, наконец, может быть необязательная дробная часть ((?:,\d{1,3})?)

Редактировать:

Если вы хотите избежать 1,111.1, тогда якоря \b не подходят для вас.Попробуйте это:

(?<=^|\s)\d{1,3}(?: \d{3})*(?:,\d{1,3})?(?=\s|$)

Regexr

Для этого регулярного выражения теперь требуется пробел или начало строки до и пробел или конец строки после числа

Редактировать 2:

Поскольку взгляды сзади не поддерживаются, вы можете изменить на

(?:^|\s)\d{1,3}(?: \d{3})*(?:,\d{1,3})?(?=\s|$)

Это ничего не меняет в началестрока, но если номер начинается с начального пробела, он теперь включается в совпадение.Если результат совпадения используется для чего-то, сначала необходимо удалить начальный пробел (я вполне уверен, что в VBA для этого есть метонд (попробуйте trim())).

0 голосов
/ 21 ноября 2011

Если вы читаете построчно, вы можете рассмотреть возможность добавления якорей (^ и $) к своему регулярному выражению, так что в итоге вы получите что-то вроде этого:* Это дает указание механизму RegEx начинать сопоставление с начала строки до самого конца.

...