perl regex负集在负前瞻中的匹配字符串

时间:2016-06-28 18:21:37

标签: regex perl regex-negation negative-lookahead

我试图匹配除方括号([^\[\]]+)之外的任何字符集(方括号内) - 除非字符串的最后部分与-notme匹配。< / p>

perl -sp -e 'if (/\[[^\[\]]+?(?!-notme)\]$/../^no/)
 { print "#"; s/^yes/$VAR/; }' -- -VAR="CHANGED" /tmp/input

我的输入文件如下所示:

-bash-4.2# cat /tmp/input 
[test-ing]
yes
yes
no
maybe

[test-ing-notme]
yes
yes
no
maybe

但我的输出看起来像:

#[test-ing]
#CHANGED
#CHANGED
#no
maybe

#[test-ing-notme]
#CHANGED
#CHANGED
#no
maybe

我的猜测是负面集合与我的负面前瞻不匹配 - 因此我尝试使用负集合的懒惰匹配,但结果与贪婪匹配相同。

我的期望是输出看起来像:

#[test-ing]
#CHANGED
#CHANGED
#no
maybe

[test-ing-notme]
yes
yes
no
maybe

1 个答案:

答案 0 :(得分:2)

您应该将模式更改为:/\[[^\[\]]+?(?!-notme)\]$/

/\[[^]]++(?<!-notme)]$/
#      ^ ^-------------- a negative loobehind before the closing bracket
#      '---------------- a possessive quantifier to prevent backtracking

通过这种方式,您可以确保“-notme”未在字符串中的无用位置进行测试。

正如您所看到的,如果这个位于第一个位置或者在否定插入符号后面,则可以不转义字符类中的右括号。