Как я могу сделать, чтобы мой Access VBA regex возвращал все возможные совпадения, а не только первое совпадение? - PullRequest
0 голосов
/ 08 января 2019

Это мой текущий код, он возвращает только первое совпадение, мне нужно вернуть все совпадения. Например, [номер телефона 1] и [номер телефона 2] и [номер телефона 3] ... но он только возвращает [номер телефона 1].

Public Function X_FIND( _
    ByVal SourceString As String, _
    ByVal Pattern As String, _
Optional ByVal IgnoreCase As Boolean = True, _
    Optional ByVal MultiLine As Boolean = True, _
    Optional ByVal MatchGlobal As Boolean = True) As String

    Dim re As New regexp
        re.MultiLine = MultiLine
        re.IgnoreCase = IgnoreCase
        re.Global = MatchGlobal
        re.Pattern = Pattern
    Dim m
    For Each m In re.Execute(SourceString)
        X_FIND = m.Value
    Next
End Function

1 Ответ

0 голосов
/ 10 января 2019

Я изменил 1 строку в функции:

X_FIND = X_FIND & "," & m.value

Я проверил функцию с входами:

Mid(X_FIND("999-999-9998 abckd 999-999-9999", "[0-9]{3}-[0-9]{3}-[0-9]{4}"),2)

Возвращает строку:

999-999-9998,999-999-9999

Если есть возможность дублирования телефонных номеров, используйте шаблон:
"([0-9]{3}-[0-9]{3}-[0-9]{4})(?!.*?\1.*$)"

Будет возвращено только последнее совпадение каждого уникального значения.

Если вы хотите убедиться, что возвращаемые значения находятся в порядке возрастания, потребуется больше кода, что непросто, насколько я вижу, и включает запись уникальных совпадений в массив (это легко с функцией Split) или сбор и применение пузырьковая сортировка или какой-либо другой алгоритм (это сложная часть).

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