我使用Linux mint并尝试使用grep
命令进行模式匹配。我已经阅读了一些教程并且他们声明匹配的是一个简单的3位数的电话号码,后跟一个连字符后跟4位数字,即123-4567匹配模式
[0-9]{3}-[0-9]{4}
好的,所以我理解正则表达式的意思,但问题是它根本不起作用。我发现解决方案实际上是
[0-9\]{3\}-[0-9\]{4\}
现在我真的很困惑。我认为反斜杠(\)是一个转义字符,我想逃避什么都没有。第二种模式有效,我不明白为什么。我在课堂上教过的并在许多教程中找到的那个根本不起作用。请有人帮我理解这里有什么交易。
答案 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: