У вас есть 2 проблемы.
Во-первых, выражение - если вам нужно извлечь почтовый индекс, вы не можете привязать свое регулярное выражение с помощью ^
и $
.Первый означает «совпадение должно происходить в начале строки», а второе означает «совпадение должно заканчиваться в конце строки».Это полезно, только если вы проверяете почтовый индекс, но, очевидно, его нельзя использовать для извлечения одного из ваших примеров, потому что все они содержат , кроме почтового кода.Другая проблема с регулярным выражением - это отрицательное прогнозное утверждение (?!.*[DFIOQU])
, что означает, что «ни одно совпадение не может содержать буквы D, F, I, O, Q или U».Насколько я помню, это не поддерживается в регулярных выражениях VBScript.Если я ошибаюсь, пожалуйста, исправьте меня в комментариях.
Это дает вам немного более педантичное выражение:
[ABCEGHJKLMNPRSTVX]\d[ABCEGHJKLMNPRSTVWXYZ][ -]?\d[ABCEGHJKLMNPRSTVWXYZ]\d
Я позволил себе по желанию разрешить-
между FSA и LDU, потому что я вижу, что лот , особенно от неканадцев.
Во-вторых, функция, которую вы вызываете (скопировано ниже изсвязанный ответ):
Function RegexExtract(ByVal text As String, _
ByVal extract_what As String, _
Optional separator As String = ", ") As String
Dim allMatches As Object
Dim RE As Object
Set RE = CreateObject("vbscript.regexp")
Dim i As Long, j As Long
Dim result As String
RE.pattern = extract_what
RE.Global = True
Set allMatches = RE.Execute(text)
For i = 0 To allMatches.count - 1
For j = 0 To allMatches.Item(i).submatches.count - 1
result = result & (separator & allMatches.Item(i).submatches.Item(j))
Next
Next
If Len(result) <> 0 Then
result = Right$(result, Len(result) - Len(separator))
End If
RegexExtract = result
End Function
Первая проблема заключается в том, что она чувствительна к регистру.Он также предназначен для извлечения подсовпадений, которые вас не интересуют - ваши примеры ищут одно совпадение.
Я бы пошел с этим гораздо более простым вариантом, который также правильно форматирует вывод:
Public Function ExtractCanadianPostalCode(inputText As String) As String
With CreateObject("vbscript.regexp")
.Pattern = "[ABCEGHJKLMNPRSTVX]\d[ABCEGHJKLMNPRSTVWXYZ][ -]?\d[ABCEGHJKLMNPRSTVWXYZ]\d"
.IgnoreCase = True
If .Test(inputText) Then
Dim matches As Object
Set matches = .Execute(inputText)
ExtractCanadianPostalCode = UCase$(Left$(matches(0), 3) & " " & Right$(matches(0), 3))
End If
End With
End Function