【问题标题】:bash regex not workingbash正则表达式不起作用
【发布时间】:2016-08-17 13:44:51
【问题描述】:

所以我有这个代码

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

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

【问题讨论】:

  • 在你的 if 条件下,$output 应该不带引号
  • @Manish 试过没用
  • 检查这个:- ideone.com/c1ojBS 它的工作
  • 是的,它不起作用,因为您的正则表达式也不正确。你真正想要什么?
  • @Manish 正则表达式是正确的以及代码正在运行..不理解 OP 的问题

标签: regex bash shell scripting


【解决方案1】:

ASD\[(.*?)\] 中的 ? 不属于那里。看起来您正在尝试对 * 应用非贪婪修饰符,在 Perl 兼容的语法中它是 *?,但 Bash 不支持。 (请参阅指南here。)事实上,如果您在测试后检查$?,您会发现它不是 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'

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

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-08
    • 2015-06-19
    • 1970-01-01
    相关资源
    最近更新 更多