Как смоделировать lookbehind в регулярном выражении VBA?

Я пытаюсь построить шаблон регулярных выражений, который вернется False если строка начинается с определенных символов или содержит несловесные символы, но потому что VBA RegExp объект не поддерживает вид сзади, я нахожу это трудным. Единственные префиксы символов слова, которые должны потерпеть неудачу, являются B_, B-, b_, b-.

Это мой тестовый код:

Sub testregex()

Dim re As New RegExp

re.pattern = "^[^Bb][^_-]\w+$"

Debug.Print re.Test("a24")
Debug.Print re.Test("a")
Debug.Print re.Test("B_")
Debug.Print re.Test(" a1")


End Sub

Я хочу это вернуть:

True
True
False
False

но вместо этого он возвращает

True
False
False
True

Проблема в том, что шаблон ищет персонажа, которого нет в [Bb]сопровождаемый персонажем, которого нет в [-_]сопровождаемый последовательностью символов слова, но я хочу только один или несколько символов слова, так что если есть 2 или более символов, то первые два не [Bb][-_],

3 ответа

Решение

Попробуйте сопоставить это выражение:

^([Bb][\-_]\w*)|(\w*[^\w]+\w*)$

... который будет соответствовать "B_", "b_", "B-" и "b-" или любому, что не является символом слова. Считайте успешное совпадение "неудачей" и допустите только несоответствия.

re.Pattern = "^(?:[^ Bb][^ _-]\w+|[^ Bb][^ _-]|[^ Bb])$"

Вы можете получить свои спички с

regEx.Pattern = "^[^ bB][^_ -]*\w*$"
regEx.MultiLine = True
Debug.Print regEx.Test("a24")
Debug.Print regEx.Test("a")
Debug.Print regEx.Test("B_")
Debug.Print regEx.Test(" a1")

Выход:

True
True
False
False
Другие вопросы по тегам