Regex bash正则表达式不工作

Regex bash正则表达式不工作,regex,bash,shell,scripting,Regex,Bash,Shell,Scripting,所以我有这个密码 function test(){ local output="ASD[test]" if [[ "$output" =~ ASD\[(.*?)\] ]]; then echo "success"; else echo "fail" fi; } 正如您所看到的,它应该是成功的,因为字符串与正则表达式匹配。然而,这最终返回失败。我做错了什么?ASD\[(.*?)中的?不属于那里。看起来您试图对*应用一个非贪婪修饰符,这是Perl兼容语法中的*?

所以我有这个密码

function test(){
  local output="ASD[test]"
  if [[ "$output" =~ ASD\[(.*?)\] ]]; then
     echo "success";
  else
     echo "fail"
  fi;
}

正如您所看到的,它应该是成功的,因为字符串与正则表达式匹配。然而,这最终返回失败。我做错了什么?

ASD\[(.*?)中的
不属于那里。看起来您试图对
*
应用一个非贪婪修饰符,这是Perl兼容语法中的
*?
,但Bash不支持这一点。(请参阅指南)。事实上,如果在测试后检查
$?
,您将看到它不是1(正常的“字符串不匹配”结果),而是2,这表示正则表达式中存在语法错误

如果使用更简单的模式
ASD\[(.*)\]
,则匹配将成功。但是,如果您在一个字符串上使用该正则表达式,该字符串可能会有稍后的括号实例,那么括号将捕获太多的内容。例如:

output=ASD[test1],ASD[test2]
[[ $output =~ ASD\[(.*)\] ]] && echo "first subscript is '${BASH_REMATCH[1]}'"
#=> first subscript is 'test1],ASD[test2'
在支持
*?
语法的语言中,它使匹配成为“非贪婪”的,因此它将匹配使整体匹配成功的最小字符串;如果没有
,这些表达式总是匹配最长的表达式。因为Bash没有非贪婪性,所以最好的选择可能是使用一个字符类,该类匹配除右括号外的所有字符,使得匹配无法超过第一个字符:

[[ $output =~ ASD\[([^]]*)\] ]] && echo "first subscript is '${BASH_REMATCH[1]}'"
#=> first subscript is 'test1'

请注意,如果在下标括号内有任何嵌套的括号对层,则此操作将中断,
*?
版本也会中断。

ASD\[(.*?)\]中的
不属于此处。看起来您试图对
*
应用一个非贪婪修饰符,这是Perl兼容语法中的
*?
,但Bash不支持这一点。(请参阅指南)。事实上,如果在测试后检查
$?
,您将看到它不是1(正常的“字符串不匹配”结果),而是2,这表示正则表达式中存在语法错误

如果使用更简单的模式
ASD\[(.*)\]
,则匹配将成功。但是,如果您在一个字符串上使用该正则表达式,该字符串可能会有稍后的括号实例,那么括号将捕获太多的内容。例如:

output=ASD[test1],ASD[test2]
[[ $output =~ ASD\[(.*)\] ]] && echo "first subscript is '${BASH_REMATCH[1]}'"
#=> first subscript is 'test1],ASD[test2'
在支持
*?
语法的语言中,它使匹配成为“非贪婪”的,因此它将匹配使整体匹配成功的最小字符串;如果没有
,这些表达式总是匹配最长的表达式。因为Bash没有非贪婪性,所以最好的选择可能是使用一个字符类,该类匹配除右括号外的所有字符,使得匹配无法超过第一个字符:

[[ $output =~ ASD\[([^]]*)\] ]] && echo "first subscript is '${BASH_REMATCH[1]}'"
#=> first subscript is 'test1'

请注意,如果在下标括号内有任何嵌套的括号对层,则此操作将中断,
*?
版本也会中断。

在您的if条件下,$output不应为空quotes@Manish尝试了但没有工作检查此:-它工作是的,它不会工作,因为您的正则表达式也不正确。你到底想要什么?@Manish regex是正确的,代码正在运行。不明白OP的问题在你的if条件下$output不应该没有吗quotes@Manish尝试了但没有工作检查此:-它工作是的,它不会工作,因为您的正则表达式也不正确。你到底想要什么?@Manish regex是正确的,代码正在运行。不理解OP的问题