为什么这个正则表达式匹配/ \ w + [^(] /?

时间:2015-07-11 18:23:07

标签: ruby regex

>> 'hola(' =~ /\w+[^(]/
=> 0
>> $&
=> "hola"

据我所知,/\w+[^(]/应与未跟(的单词匹配。我还尝试使用negative look-behind并转义(;结果相同。

我发现这是疏远的,如果我尝试使用/a[^(]/,它就可以正常工作(正如预期的那样)。

>> 'hola(' =~ /a[^(]/
=> nil

所以它肯定与+量词有关。

发生了什么事?

我尝试使用Ruby 2.2Python 3.3

3 个答案:

答案 0 :(得分:4)

hol部分与表达式的\w+部分匹配,[^(]部分与a部分匹配。输入的(部分将被忽略。

添加$以解决问题:

>> 'hola(' =~ /\w+[^(]$/
=> nil

答案 1 :(得分:2)

在此示例中,正则表达式引擎的工作方式如下:向下扫描到与hola部分匹配的\w+,但下一个字符(不匹配{{1}然后执行回溯,并发现它在[^(]hol部分时匹配,\w+匹配a部分。

您可以通过[^(]使用独立的正则表达式引擎来禁止回溯:

(?>re)

'hola(' =~ /(?>\w+)[^(]/ # => nil 重复占有

++

两者都是Ruby 'hola(' =~ /\w++[^(]/ # => nil 扩展名。

答案 2 :(得分:1)

实际上\w+[^(]匹配一个或多个单词字符,后跟任何不是(的字符。 这意味着它将匹配hola并忽略最后一个字符。

根据您要使用此功能的位置,\w+\b(?!\()这样的模式可能更合适,因为它会匹配(后面没有的任何单词。