Regalar表达 - 如何逃避

时间:2016-01-26 22:27:32

标签: regex escaping

我无法理解如何在正则表达式中逃脱。 我知道,如果我在字符前加上'\',它应该与字符串匹配。

但如果我输入

echo "hello 8 9 2013" | grep -e "^hello|hello$"

我一无所获。 如果我输入

echo "ciao 8 9 2013" | grep -e "^ciao\|ciao$"

它运作正常。

有人可以解释一下这种行为的原因吗?

在第二个代码中,我希望grep找到一个“|”,而在第一个代码中,我希望grep将它解释为“或”。但我恰恰相反。

2 个答案:

答案 0 :(得分:1)

默认情况下,grep实现“基本”正则表达式,其中|是普通字符,而\|是交替运算符。如果您使用grep -E(或更早的名称egrep),它会实现“扩展”正则表达式,这对于此运算符的工作方式相反。

这里解释了基本和扩展正则表达式之间的区别:

http://www.regular-expressions.info/posix.html

答案 1 :(得分:0)

grep中的默认正则表达式引擎是基本正则表达式(BRE),需要转义|

您可以使用-E 扩展正则表达式覆盖此行为,如下所示:

echo "hello 8 9 2013" | grep -E "^hello|hello$"

根据man grep

-E, --extended-regexp
  Interpret pattern as an extended regular expression (i.e. force grep to behave as egrep).