Regex 如何在VBA正则表达式中模拟lookbehind?
我试图构建一个正则表达式模式,如果字符串以某些字符开头或包含非单词字符,它将返回Regex 如何在VBA正则表达式中模拟lookbehind?,regex,vba,excel,Regex,Vba,Excel,我试图构建一个正则表达式模式,如果字符串以某些字符开头或包含非单词字符,它将返回False,但由于VBA的RegExp对象不支持lookbehind,我发现这很困难。唯一应该失败的单词字符前缀是B_2;、B-、B_2;、B- 这是我的测试代码: Sub testregex() Dim re As New RegExp re.pattern = "^[^Bb][^_-]\w+$" Debug.Print re.Test("a24") Debug.Print re.Test("a") Debu
False
,但由于VBA的RegExp
对象不支持lookbehind,我发现这很困难。唯一应该失败的单词字符前缀是B_2;、B-、B_2;、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]
中的字符,后跟不在[-\u]
中的字符,后跟一系列单词字符,但我想要的只是一个或多个单词字符,因此如果有两个或多个字符,那么前两个就不是[Bb][-\u1]
尝试匹配此表达式:
^([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
在表达式
“a1”
中有2个或更多字符,前两个字符不是[Bb][-\u]
,但您希望.Test(“a1”)
返回False
。按照您的定义,它应该是True
。请解释我遗漏了什么?@omegastripes,字符串应该只有单词字符,这就是为什么我在正则表达式模式中使用了\w
。@femtoRgon,是的,我目前的解决方法涉及两个正则表达式。我希望找到一个单一的正则表达式解决方案,因为这将有助于代码的可扩展性。虽然这将排除“B_xxy”,但它也将排除“B2xxy”,这应该会通过。唯一应该失败的前缀是B\u,B-,B\u,B-
。如果我在最初的问题中没有说清楚的话,我很抱歉。我调整了表达方式,尽管最容易颠倒你对结果的看法,这样“成功”就是失败。