Regex 正则表达式匹配前面没有bang的字符串

Regex 正则表达式匹配前面没有bang的字符串,regex,bash,Regex,Bash,在bash中,我试图匹配数组中存在的有效属性。属性可以通过在它们前面加上一个bang(感叹号,!)来“禁用”,在这种情况下,它们不能匹配。我有这个: [[ ${TESTS[@]} =~ [^\!]match ]] 如果单词“match”在测试中且前面没有“!”,则返回true 它可以工作,除非单词匹配在数组中的第一个位置。问题是regexp的意思是“match前面有非a的内容!”。当它是第一项时,它前面没有任何内容,因此不匹配 我如何修改上述内容,使之成为“match not prefored

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

[[ ${TESTS[@]} =~ [^\!]match ]]
如果单词“match”在测试中且前面没有“!”,则返回true

它可以工作,除非单词匹配在数组中的第一个位置。问题是regexp的意思是“match前面有非a的内容!”。当它是第一项时,它前面没有任何内容,因此不匹配

我如何修改上述内容,使之成为“match not prefored by!”

从阅读我尝试过的其他问题的答案(?但这不起作用。

使用以下方法:

([^\!]|^)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

$echo match | grep-qP'(?@blackvegeture:
如果是THING1;那么是THING2;else THING3;fi=THING1&&THING2 | | THING3
对,我想的就是这样。谢谢!添加了关于“(?我很高兴帮助你!)啊,谢谢。所以我当时的思路是正确的——我只是没有意识到bash没有重复断言。再次感谢。