正则表达式匹配不在爆炸之前的字符串

时间:2012-08-01 16:51:16

标签: regex bash

在bash中,我试图匹配数组中存在的有效属性。属性可以通过在它们前面加上一个(感叹号,!)来“禁用”,在这种情况下它们不能匹配。我有这个:

[[ ${TESTS[@]} =~ [^\!]match ]]

如果“匹配”一词在TESTS中并且前面没有!,则返回true。

它有效,除非单词match位于数组的第一个位置。问题是正则表达式是说'匹配之前的东西不是!'。当它是第一个项目时,它前面没有任何东西,因此不匹配。

如何修改上述内容以说明'匹配之前没有!'

从阅读答案到我试过的其他问题(?< !!)匹配但这不起作用。

1 个答案:

答案 0 :(得分:2)

使用此re:

([^\!]|^)match

使用示例:

$ [[ match =~ (^|[^\!])match ]] && echo matches || echo "doesn't match"
matches
$ [[ xmatch =~ (^|[^\!])match ]] && echo matches || echo "doesn't match"
matches
$ [[ '!match' =~ (^|[^\!])match ]] && echo match || echo "doesn't match"
doesn't match

一般来说,在这里使用断言也是正确的,但是bash使用POSIX正则表达式,而且他们对断言一无所知。但是使用grep(GNU grep)或perl,或任何支持PCRE的东西,你都可以这样做:

$ echo match | grep -qP '(?<!!)match' && echo matches || echo "doesn't match"
matches
$ echo xmatch | grep -qP '(?<!!)match' && echo matches || echo "doesn't match"
matches
$ echo '!match' | grep -qP '(?<!!)match' && echo matches || echo "doesn't match"
doesn't match