我正在学习grep
atm,但我很难理解kleene星元字符的工作。手册页描述*
匹配前一个字符0次或更多次。我使用一个名为test
的文件,内容如下
*a
123ab
1234
abcdef
a?
?
grep 'a*' test
应该匹配零次或多次出现的a
,并且如前所述打印输出中test
文件的每一行。文档进一步说明,要匹配像*
这样的元字符,必须在它们前面加上反斜杠来进行转义。但是
grep '*' test
和grep '*' test
的输出是相同的。输出:*a
*
不与
前面匹配? *
本身是一个无效的正则表达式,因为没有重复的前一项。在本例中,grep的实现将其解释为文字*
。*
是一个匹配*
的有效正则表达式。您的实现对无效正则表达式*
和有效正则表达式*
的解释恰好是相同的。
如果你真的想看到*
和*
之间的区别,你应该在一个有效的正则表达式上添加一个项目。例如,文字a
:
grep 'a*'
grep 'a*'
前者将匹配任何字符,因为*
可以成功匹配0个字符。后者只匹配包含a*
的行。
根据SUSv3的9.3.3节,正则表达式的前导*
是有效的。火影忍者,您的平台的正则表达式解释器在这里做了正确的事情:当*
位于正则表达式的开头时,它不是一个特殊字符。