Имитация общего позитивного взгляда на регулярное выражение 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