我想匹配一个在开头和结尾都包含一些文本但在中间不包含其他文本的字符串。例如:以一个单词(\ w +)开头,再以另一个单词结尾,但中间不包含NOT
:
some_YES_text // ok
other_COOL_string // also ok
some_NOT_string // don't want to match this
通常,我可以使用负前瞻来做到这一点:
\w+_(?!NOT)\w+_\w+
但是我在Bash中编写了不支持的脚本。达到相同效果的最简单方法是什么?
编辑:我之前并不十分精确-我仍然需要使用正则表达式,而不仅仅是纯文本匹配。
答案 0 :(得分:1)
您可以匹配abc_NOT_def
或 abc_anywordhere_def
并捕获其中一个或部分捕获,并在匹配后检查捕获是否为空。然后,只需实现所需的逻辑即可:
s="other_NOT_string"
rx='^([[:alnum:]_]+_(NOT)_[[:alnum:]_]+|[[:alnum:]_]+_[[:alnum:]_]+_[[:alnum:]_]+)$'
if [[ "$s" =~ $rx ]]; then
if [ -z ${BASH_REMATCH[2]} ]; then
echo "MATCH: ${BASH_REMATCH[0]}"
else
echo "No match"
fi;
else
echo "No match"
fi;
详细信息
^
-字符串的开头(
-第1组开始:
[[:alnum:]_]+_
-1个以上的字符字符(等同于POSIX ERE \w
)和_
(NOT)
-第2组:NOT
_[[:alnum:]_]+
-_
和1个以上的字符字符|
-或[[:alnum:]_]+_[[:alnum:]_]+_[[:alnum:]_]+
-1个以上的字符字符,_
,1个以上的字符字符,_
和1个以上的字符字符)
-第1组结束。$
-字符串结尾在[ -z ${BASH_REMATCH[2]} ]
条件下,我们检查NOT
是否匹配。如果是,则没有有效的匹配,否则,有一个有效的匹配。