在Linux上使用正则表达式我不明白什么?

时间:2018-02-14 03:05:28

标签: regex pattern-matching

我使用Linux mint并尝试使用grep命令进行模式匹配。我已经阅读了一些教程并且他们声明匹配的是一个简单的3位数的电话号码,后跟一个连字符后跟4位数字,即123-4567匹配模式

[0-9]{3}-[0-9]{4}

好的,所以我理解正则表达式的意思,但问题是它根本不起作用。我发现解决方案实际上是

[0-9\]{3\}-[0-9\]{4\}

现在我真的很困惑。我认为反斜杠(\)是一个转义字符,我想逃避什么都没有。第二种模式有效,我不明白为什么。我在课堂上教过的并在许多教程中找到的那个根本不起作用。请有人帮我理解这里有什么交易。

2 个答案:

答案 0 :(得分:1)

事实证明,传统上grep实现了POSIX Basic正则表达式(BRE)而不是扩展正则表达式(ERE)。区别在于元字符。在BRE中,只有^ $ . [ ] *是元,其他所有都被视为文字。 ERE添加了元字符( ) { } ? + |及其相关功能。由于没有任何其他选项的grep使用BRE,因此您实际上必须向( ) { }添加一个反弹,因为它们被视为元字符。这完全是来自ERE的后退,其中附加反弹导致被视为文字。或者,您可以使用-E选项运行grep,以使用扩展正则表达式或egrep命令。为了使这一点不那么冗长和清晰...

grep [0-9\]{3\}-[0-9\]{4\}

产生与

相同的结果
grep -E [0-9]{3}-[0-9]{4}

产生与

相同的结果
egrep [0-9]{3}-[0-9]{4}

答案 1 :(得分:0)

非常简短,

grep默认使用标准POSIX正则表达式,您需要在其中转义几个字符,例如{}|+,{ {1}},?(。请注意,)[不需要转义!!

为了逃避所有这些角色是一种痛苦,您可以使用]或使用grep -E '[0-9]{3}-[0-9]{4}'的perl正则表达式使用grep扩展正则表达式。扩展正则表达式允许使用grep -P '[0-9]{3}-[0-9]{4}'类用于alphanum等.Perl正则表达式更强大,因为它们允许lookbehind和lookahead以及许多其他定义的关键字。

[[:alnum:]]

READINGS: