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