Regex для извлечения противоречивых почтовых индексов из строки - PullRequest
0 голосов
/ 05 октября 2018

Используя решение, опубликованное здесь , я хочу извлечь почтовые индексы из списка неправильных данных в Excel.

Ниже приведен пример того, как мои данные выглядят:

Brampton L6P 2G9 ON Канада

M5B2R3 Торонто ON

Торонто M5J 0A6 ON Канада

M1H1T7 Канада

Toronto M4P1T8 ONКанада

MISSISUAGABRAMPTON L5M6S6 ВКЛ Канада

333 Sea Ray Inisfil l4e2y6 ВКЛ Канада

Для вызова функции я использую следующую формулу

=RegexExtract(A1,"^(?!.*[DFIOQU])[A-VXY][0-9][A-Z] ?[0-9][A-Z][0-9]$")

Однако эта функция не работает для меня.Я думаю, что мне нужно каким-то образом подправить выражение регулярных выражений, но я не знаю, чего мне не хватает.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Попробуйте,

=REGEXEXTRACT(upper(A2), "[A-X]\d[A-Z] ?\d[A-Z]\d")
'alternate
=left(REGEXEXTRACT(upper(A2), "[A-X]\d[A-Z] ?\d[A-Z]\d"), 3)&" "&right(REGEXEXTRACT(upper(A2), "[A-X]\d[A-Z] ?\d[A-Z]\d"), 3)

enter image description here

0 голосов
/ 05 октября 2018

У вас есть 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...