Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 匹配不匹配的字符串';在Bash中不包含其他字符串? 我想匹配一个字符串,其中包含一些文本在开始和结束,但不包含一个不同的文本在中间。例如:以一个单词(\w+)开头,以另一个单词结尾,但不包含介于两者之间的NOT: some_YES_text // ok other_COOL_string // also ok some_NOT_string // don't want to match this_Regex_Bash - Fatal编程技术网

Regex 匹配不匹配的字符串';在Bash中不包含其他字符串? 我想匹配一个字符串,其中包含一些文本在开始和结束,但不包含一个不同的文本在中间。例如:以一个单词(\w+)开头,以另一个单词结尾,但不包含介于两者之间的NOT: some_YES_text // ok other_COOL_string // also ok some_NOT_string // don't want to match this

Regex 匹配不匹配的字符串';在Bash中不包含其他字符串? 我想匹配一个字符串,其中包含一些文本在开始和结束,但不包含一个不同的文本在中间。例如:以一个单词(\w+)开头,以另一个单词结尾,但不包含介于两者之间的NOT: some_YES_text // ok other_COOL_string // also ok some_NOT_string // don't want to match this,regex,bash,Regex,Bash,通常情况下,我可以通过负前瞻来实现: \w+_(?!NOT)\w+_\w+ 但我正在用Bash编写一个不支持它的脚本。达到同样效果的最简单方法是什么 编辑:我以前并不精确-我仍然需要使用正则表达式,而不仅仅是纯文本匹配。您可以匹配abc\u not\u def或abc\u anywordhere\u def并捕获其中一个或部分,匹配后,检查捕获是否为空。然后,只需实现您需要的逻辑: s="other_NOT_string" rx='^([[:alnum:]_]+_(NOT)_[[:alnum:

通常情况下,我可以通过负前瞻来实现:

\w+_(?!NOT)\w+_\w+
但我正在用Bash编写一个不支持它的脚本。达到同样效果的最简单方法是什么


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

您可以匹配
abc\u not\u def
abc\u anywordhere\u 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:][+][/code>-1+字字符(POSIX ERE
      \w
      等效)和a
    • (非)
      -第2组:
    • \u[:alnum:][unum:][+
      -
      和1+字字符
    • |
      -或
    • [:alnum:][uUnum:][uUnum:][uUnum:][uUnum:][uUnum:][uUnum:][/code>-1+字字符、
      、1+字字符、
      和1+字字符
  • -第1组结束
  • $
    -字符串结尾

使用
[-z${BASH_REMATCH[2]}]
条件,我们检查
是否匹配。如果是,则不存在有效匹配,否则存在有效匹配。

注意:PCRE正则表达式实际上应该是
\w+\u(?不是)\w+\uw+
。嗯,我现在不确定你是否真的需要在
\uuu…\ ucode>之前和之后匹配字母、数字和下划线供参考:如果你不想在
\uu…\ ucode>之前和之后允许任何
\ucode>,请从所有
[:alnum:][ucode>中删除
\ucode>。如果不希望整个字符串匹配,请删除
^
$
。这个想法在这些场景中也仍然有效:您匹配并捕获一个备选方案的一部分,其中第一个更具体,另一个更通用,并在脚本中应用其他逻辑来检查匹配是否对您有效。第1组(用于备选方案)似乎没有必要。它是?(无论哪种方式,这个想法可能是最好的方法,谢谢。)@NPS如果你需要匹配匹配模式的整个字符串,组1是至关重要的,否则,锚只能应用于每个不同的备选方案。这一点很好。但是写两次锚(针对每个备选方案)也会奏效?@NPS假设你有5个、10个或15个备选方案,你很容易错过一个或两个锚,很难快速找到它们。