-1

我正在学习grepatm,但我很难理解 kleene 星元字符的工作原理。手册页描述了*匹配前一个字符零次或多次。我正在使用一个名为test以下内​​容的文件

*a
123ab
1234
abcdef
a?
?

grep 'a*' test应该匹配零次或多次出现,a并且如解释的那样在输出中打印文件的每一行test。该文档进一步描述了要匹配元字符,例如*必须通过在它们前面加上反斜杠来进行转义\grep '*' test但是和的输出grep '\*' test是一样的。输出:*a 为什么*匹配自身而不在其前面加上\

4

2 回答 2

3

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

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

grep 'a*'
grep 'a\*'

前者将匹配任何内容,因为*可以成功匹配零个字符。后者只会匹配包含a*字面意思的行。

于 2013-01-08T06:47:42.893 回答
3

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

于 2013-01-08T17:34:27.620 回答