双锚定正则表达式

Mot*_*tti 3 regex language-agnostic anchor

我想接受用户的任意正则表达式并将其锚定在两侧以强制完全匹配 ( ^<user's-regex>$) 但我不知道是否必须考虑用户可能已经锚定了他的正则表达式这一事实。

看起来 Perl、C++、.NET 和 JavaScript 都允许双倍的多重锚定。

"hello" =~ /^h/ # true
"hello" =~ /^^h/ # true
"hello" =~ /^^^h/ # true
"hello" =~ /e/ # true
"hello" =~ /^e/ # false
"hello" =~ /^^e/ # false
Run Code Online (Sandbox Code Playgroud)

有谁知道这是否指定以这种方式工作?我可以依赖这种行为吗?或者这是一个将来可能会改变的意外事件吗?


编辑:我们需要这个的原因是我们正在使用 VBScript 的正则表达式(来自 COM),match但是我们使用它会返回所有匹配项,因此匹配字符串abcto.*a.*比匹配 to慢得多^.*a.*$通过使用@Tim建议的锚定,我们将匹配速度(对于长字符串)提高了 12 倍以上。

Tim*_*ker 5

您可以依赖这种行为。正则表达式引擎不介意连续断言相同的事情一次、两次或一百次。

但是,您不应简单地在正则表达式周围添加锚点,还应该在其周围添加一个非捕获组:

^(?:- 用户正则表达式 -)$或者最好,如果您的正则表达式风格允许这样做:\A(?:- 用户正则表达式 -)\Z

否则,如果用户在他的正则表达式中使用交替,你就会出错。比较:

user regex:         hello|bye
anchored regex:     ^hello|bye$      // alternation now affects anchors
correctly anchored: ^(?:hello|bye)$
Run Code Online (Sandbox Code Playgroud)