2013-01-08 46 views
-1

我在学习grep atm,但我很难理解kleene明星元字符的工作。手册页描述*匹配零个或多个前一个字符。我使用一个名为test文件,内容如下grep:克莱恩明星(*)应该什么时候匹配?

*a 
123ab 
1234 
abcdef 
a? 
? 

grep 'a*' test应该匹配零次或多个出现a和解释打印出test文件输出的每一行。 该文件进一步描述为了匹配像*这样的元字符,它们必须通过在前面加上反斜杠\而被转义。 但grep '*' testgrep '\*' test的输出是相同的。输出:*a 为什么*与之前没有\

+3

我相信'* a'不是一个有效的grep模式(因为它是一个无效的正则表达式)。 grep如何处理可能“未定义的行为”和实现可能会做他们想要的(并且逐字处理最初的'*'是明智的) –

+0

但是'grep'\ *'test'完全匹配它。 。 –

+0

由于'\ * a'是一个有效的正则表达式 –

回答

3

*本身是一个无效的正则表达式,因为没有以前的项目要重复。在这种情况下,您的grep实现将其解释为文字*\*是一个有效的正则表达式,它匹配*。您的实现对无效正则表达式*和有效正则表达式\*的解释恰好相同。

如果你真的想看到*\*之间的区别,你应该尝试一个有效的正则表达式,在它之前添加一个项目。例如,文字a

grep 'a*' 
grep 'a\*' 

前者将匹配任何事情,因为*可以成功匹配零个字符。后者只能字面匹配包含a*的行。

+2

无效?根据什么标准,究竟是什么? :-) – paxdiablo

+1

@paxdiablo:我脑子里的那个恰好与常见的正则表达式引擎相匹配。 – icktoofay

3

正则表达式中的前导*根据section 9.3.3 of SUSv3有效。火影忍者,你的平台的正则表达式解释器在这里做的是正确的事情:当它在正则表达式的开始时,*不是特殊字符。

相关问题