1

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

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

如果单词 'match' 在 TESTS 中并且前面没有!,它将返回 true。

它可以工作,除非单词匹配位于数组中的第一个位置。问题是正则表达式在说“匹配之前不是一个!” . 当它是第一项时,它前面没有任何内容,因此不匹配。

我如何修改上面的内容以说“匹配前面没有!” ?

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

4

1 回答 1

2

使用这个:

([^\!]|^)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)、orperl或任何支持 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
于 2012-08-01T16:54:41.093 回答