【问题标题】:Why isn't this regular expression test working? [duplicate]为什么这个正则表达式测试不起作用? [复制]
【发布时间】:2011-08-16 07:27:25
【问题描述】:

我有这个

echo $line
Thisisaline.

我想知道为什么这不起作用:

if [[ "$line" =~ "[a-zA-Z]+\.$" ]] ; then echo "hello"; fi

上面的正则表达式没有输出。

【问题讨论】:

  • 您的正则表达式模式不允许使用空格,是吗?
  • 没有,我修改了匹配字符串。

标签: regex bash shell


【解决方案1】:

问题是你使用引号......

在 bash 正则表达式中,不需要引号,而且不应使用引号(除非您尝试匹配引号(在这种情况下,您可以将其转义 \")...另外,如果您想要你的模式中有一个空格,你必须转义它,(反斜杠后面有一个空格...

还要注意,要匹配整行作为字母,您必须添加前导 ^ 和尾随 $,否则它将匹配以下行:123 456 abc. cat and mouse

【讨论】:

    【解决方案2】:

    试试

    if [[ $line =~ [a-zA-Z]+\. ]] ; then echo hello; fi
    

    【讨论】:

      【解决方案3】:

      某些带有 bash 的操作系统版本会为您提供输出。因此,获取更新取决于您。 但是,如果没有正则表达式,您可以使用扩展通配符

      shopt -s extglob
      case "$line" in
      +([a-zA-Z]). ) echo "hello";;
      esac
      

      如果没有,请使用不带引号的正则表达式

      【讨论】:

      • 是的+1,它是引号。它们不是必需的,而且也不应该在这里使用(除非你想匹配一个引号;所以如果你想在你的模式中有一个空格,您必须转义它,\ (在 \ 之后有一个空格 ... 另请注意,要将整行匹配为字母,您必须添加一个前导 ^ 和一个尾随 $,否则它将匹配123 456 abc. cat and mouse
      • @fred,好的,所以你应该把它作为答案,以便 OP 知道。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-05
      相关资源
      最近更新 更多