Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 如何在VBA正则表达式中模拟lookbehind?_Regex_Vba_Excel - Fatal编程技术网

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-
。如果我在最初的问题中没有说清楚的话,我很抱歉。我调整了表达方式,尽管最容易颠倒你对结果的看法,这样“成功”就是失败。