Regex VbScript Захват впереди
У меня есть текст в этом формате:
[AAAAA]xyzxyzxyz
[AAAAA]abcdefghi
[AAAAA]whatever
[BBBBB]aaaaaaaa
[BBBBB]cccccccc
[BBBBB]dddddddd
[CCCCC]ffffffff
[CCCCC]eeeeeeee
Я хочу захватить в множественном выборе строку после метки, без метки.
(?m)(?<=^\[BBBBBB\]).*$
Чтобы получить массив с:
[1]aaaaaaaa
[2]cccccccc
[3]dddddddd
например, отлично работает в моем редакторе, но просмотр вперед не поддерживается в Excel VBA (vbscript.regex)
Лучшее, что я могу сделать, это:
((^\[BBBBBB\])(.*?)$)
и замените метку ничем во втором шаге.
Существует ли хороший способ конвертировать: (? M)(?<=^[BBBBBB]).*$ В движок регулярных выражений vba?
Спасибо за помощь.
Дэвид.
2 ответа
Позитивный взгляд здесь не является необходимым, поскольку его единственная цель здесь - определить левый контекст для нужного вам соответствия, и нет совпадений. Таким образом, вместо этого вы можете безопасно использовать шаблон потребления и заключить остальную часть шаблона или интересующую вас часть в скобки, чтобы позднее получить содержимое группы 1.
использование
.Pattern = "^\[B{5}\]\s*([^\r\n]*)"
.
лучше заменить на [^\r\n]
исключить \r
из матча, и {5}
это более удобный способ написать 5 B
s.
Полная демонстрация:
Sub DemoFn2()
Dim re As RegExp
Dim s As String
Dim colMatch As MatchCollection, objMatch As Match
s = "[AAAAA]xyzxyzxyz" & vbCrLf & "[AAAAA] abcdefghi" & vbCrLf & "[AAAAA] whatever" & vbCrLf & "[BBBBB] aaaaaaaa" & vbCrLf & "[BBBBB] cccccccc" & vbCrLf & "[BBBBB] dddddddd" & vbCrLf & "[CCCCC] ffffffff" & vbCrLf & "[CCCCC] eeeeeeee"
Set re = New RegExp
With re
.Pattern = "^\[B{5}\]\s*([^\r\n]*)"
.Global = True ' Same as /g at the online tester
.MultiLine = True ' Same as /m at regex101.com
End With
Set colMatch = re.Execute(s)
For Each objMatch In colMatch
Debug.Print objMatch.SubMatches.Item(0)
Next
End Sub
Спасибо за ваш быстрый и полный ответ.
Я адаптирую вашу работу к контексту, но это работает!!! Спасибо за все объяснения.
Дэвид.