什么时候星号(*)应该匹配自己



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

*a
123ab
1234
abcdef
a?
?

grep 'a*' test应该匹配零次或多次出现的a,并且如前所述打印输出中test文件的每一行。文档进一步说明,要匹配像*这样的元字符,必须在它们前面加上反斜杠来进行转义。但是grep '*' testgrep '*' test的输出是相同的。输出:*a

为什么*不与前面匹配?

*本身是一个无效的正则表达式,因为没有重复的前一项。在本例中,grep的实现将其解释为文字**是一个匹配*的有效正则表达式。您的实现对无效正则表达式*和有效正则表达式*的解释恰好是相同的。

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

grep 'a*'
grep 'a*'

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

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

最新更新