如何在VBA正则表达式中模拟lookbehind?

时间:2015-03-23 20:57:02

标签: regex vba excel-vba excel

我正在尝试构建一个正则表达式模式,如果字符串以某些字符开头或包含非单词字符,将返回False,但由于VBA的RegExp对象不支持lookbehind,我我发现这很困难。应该失败的唯一字符前缀是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 个答案:

答案 0 :(得分:3)

尝试匹配此表达式:

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

...将匹配" B _"," b _"," B - "和" b - "或任何不是单词字符的东西。考虑成功匹配"失败"并且只允许非匹配有效。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以通过

获得比赛
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