在bash中,我试图匹配数组中存在的有效属性。属性可以通过在它们前面加上一个(感叹号,!)来“禁用”,在这种情况下它们不能匹配。我有这个:
[[ ${TESTS[@]} =~ [^\!]match ]]
如果“匹配”一词在TESTS中并且前面没有!,则返回true。
它有效,除非单词match位于数组的第一个位置。问题是正则表达式是说'匹配之前的东西不是!'。当它是第一个项目时,它前面没有任何东西,因此不匹配。
如何修改上述内容以说明'匹配之前没有!'?
从阅读答案到我试过的其他问题(?< !!)匹配但这不起作用。
答案 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