>> 'hola(' =~ /\w+[^(]/
=> 0
>> $&
=> "hola"
据我所知,/\w+[^(]/
应与未跟(
的单词匹配。我还尝试使用negative look-behind
并转义(
;结果相同。
我发现这是疏远的,如果我尝试使用/a[^(]/
,它就可以正常工作(正如预期的那样)。
>> 'hola(' =~ /a[^(]/
=> nil
所以它肯定与+
量词有关。
发生了什么事?
我尝试使用Ruby 2.2
和Python 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(?!\()
这样的模式可能更合适,因为它会匹配(
后面没有的任何单词。