Имитация общего позитивного взгляда на регулярное выражение VBA

В VBA множество вопросов о взглядах позади. Проблема в том, что, хотя есть положительные и отрицательные взгляды, VBA вообще не поддерживает взгляды назад.

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

2 ответа

Решение

Следующая функция принимает три аргумента для решения этой проблемы: сопоставляемая строка, шаблон регулярного выражения необратимого префикса и шаблон регулярного выражения следующей группы захвата.

Function LookBehindRegex(ByVal inputText As String, nonCaptureRegex As String, _
   captureRegex As String)

    'Non capturing lookbehind to retrieve reference preceded by a regex group

    Dim regEx As New RegExp
    Dim intermediate As String
    Dim nonCaptureText As String

    regEx.IgnoreCase = True
    'First set the capture pattern to both regex groups, to capture the whole text
    regEx.Pattern = "(" & nonCaptureRegex & ")" & "(" & captureRegex & ")"
    'Store that
    intermediate = regEx.Execute(inputText)(0)
    'Next, set the pattern to only capture the non-capture regex
    regEx.Pattern = nonCaptureRegex
    'Store the non-capturable text from the intermediate result
    nonCaptureText = regEx.Execute(intermediate)(0)
    'Finally remove the non-capture text from the intermediate result
    LookBehindRegex = Replace(intermediate, nonCaptureText, "")

End Function

Ограничения: Это будет только имитировать позитивный взгляд. Соответствующий модуль регулярных выражений должен быть добавлен в качестве ссылки на проект VB.

Разве это не даст тот же результат, что и ваш ответ, с меньшим количеством работы? (Конечно, к нему нужно добавить проверку ошибок.)

Function LookBehindRegex( _
    ByVal inputText As String, nonCaptureRegex As String, _
    captureRegex As String) As String

    Dim regEx As New RegExp
    Dim mac As MatchCollection

    regEx.IgnoreCase = True
    regEx.Pattern = "(" & nonCaptureRegex & ")(" & captureRegex & ")"

    Set mac = regEx.Execute(inputText)
    If mac.Count > 0 Then _
        LookBehindRegex = mac(0).SubMatches(1)

End Function
Другие вопросы по тегам