У меня есть документ, содержащий цифры в различных форматах, французском, английском, пользовательских форматах.
Я хотел, чтобы регулярное выражение могло ловить ТОЛЬКО числа во французском формате.
Это полный список чисел, которые я хочу поймать (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>