为什么这个正则表达式测试不起作用?

19

我有这个

echo $line
Thisisaline.

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

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

以上正则表达式没有输出。


你的正则表达式模式不允许空格,是吗? - Oscar Mederos
没有,我修改了匹配字符串。 - Ankur Agarwal
3个回答

27

问题在于您使用了引号...

在Bash正则表达式中,不需要使用引号,而且更重要的是,不应该使用引号(除非您想匹配引号(在这种情况下,可以使用转义字符\")...另外,如果您想要在模式中添加一个空格,您必须对其进行转义,使用\ (反斜杠后面有一个空格...)

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


14

尝试一下

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

2

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

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

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

是的 +1,它是引号.. 它们不需要,并且更重要的是,在这里不应该使用它们(除非您想匹配引号;因此,如果您想在模式中添加空格,则必须转义它,\ (\后面有一个空格... 还要注意,为了将整行作为字母匹配,必须添加前导^和尾随$,否则它将匹配123 456 abc. cat and mouse - Peter.O
@fred,好的,你应该把它作为答案发布,这样 OP 就能知道。 :) - ghostdog74

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接