为什么这个带有捕获组的正则表达式无法在bash中运行?

时间:2016-04-27 09:08:46

标签: regex bash

我在bash脚本中执行此操作:

#!/bin/bash
set -e

function getVersion {
  REGEX="^$2-(.*?)\.ear$"
  if [[ "$1" =~ $REGEX ]]; then
    echo "${BASH_REMATCH[1]}"
  else
    echo "Cannot deduce artifact version from file name $1, exiting" >&2
    exit 1
  fi
}

MY_APP=app-1.3.4.ear
APP_VERSION=$(getVersion "$MY_APP" app)
echo "Version is $APP_VERSION"

我希望getVersion返回1.3.4,但它会生成错误消息。为什么正则表达式不匹配?

1 个答案:

答案 0 :(得分:2)

Bash并不支持?在正则表达式中表示非贪婪

幸运的是,在这种情况下你不需要它:

function getVersion {
  REGEX="^$2-(.*)\.ear$"
  if [[ "$1" =~ $REGEX ]]; then
    echo "${BASH_REMATCH[1]}"
  else
    echo "Cannot deduce artifact version from file name $1, exiting" >&2
    exit 1
  fi
}

您指定版本号后面必须包含的内容可防止.*消费它。

顺便说一句,我建议不要在shell中使用大写变量名。它们会在内部使用,因此您可能会意外覆盖有用的内容。

我通常也建议不要使用特定于bash的function语法来支持标准getVersion() {,但是您使用的是bash功能,所以我猜它是不是一个问题。