3

我正在尝试使用 bash 中可用的扩展正则表达式运算符(?、*、+、@、!)。手册说我只需要用括号括起来一个模式列表,然后在左括号之前使用运算符。因此,如果我想要零个或多个 a 的模式:

if [[ "$1" =~ *(a) ]]
then
   echo $1
fi

但这不起作用。我究竟做错了什么?

4

1 回答 1

9

man bash

额外的二元运算符 ,=~可用,其优先级与 ==和相同!=。使用时,运算符右侧的字符串被视为扩展正则表达式并进行相应匹配(如 regex(3)中)。如果字符串与模式匹配,则返回值为 0,否则为 1。如果正则表达式在语法上不正确,则条件表达式的返回值为 2。如果 nocasematch 启用了 shell 选项,则不考虑字母字符的大小写进行匹配。可以引用模式的任何部分以强制将其作为字符串匹配。正则表达式中带括号的子表达式匹配的子字符串保存在数组变量中BASH_REMATCH. 索引为 0的元素BASH_REMATCH是字符串中匹配整个正则表达式的部分。BASH_REMATCH索引为 n的元素是字符串中匹配第n个带括号的子表达式的部分。

我在这里引用了整件事,因为我认为了解它很有用。您在右侧使用标准 POSIX 扩展正则表达式。

特别是,右侧的表达式可能匹配左侧操作数的子字符串。因此,要匹配整个字符串,请使用^$锚点:

if [[ "$1" =~ ^a*$ ]]
then
    echo $1
fi
于 2012-09-27T05:25:03.690 回答