匹配Bash中不包含其他字符串的字符串?

时间:2019-05-27 08:32:46

标签: regex bash

我想匹配一个在开头和结尾都包含一些文本但在中间不包含其他文本的字符串。例如:以一个单词(\ 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中编写了不支持的脚本。达到相同效果的最简单方法是什么?

编辑:我之前并不十分精确-我仍然需要使用正则表达式,而不仅仅是纯文本匹配。

1 个答案:

答案 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是否匹配。如果是,则没有有效的匹配,否则,有一个有效的匹配。