Linux 格雷普:克莱恩之星(*)什么时候应该匹配自己?

Linux 格雷普:克莱恩之星(*)什么时候应该匹配自己?,linux,grep,kleene-star,Linux,Grep,Kleene Star,我正在学习grepatm,但我很难理解kleene-star元字符的工作原理。手册页说明*与前面的字符零次或多次匹配。我正在使用一个名为test的文件,其中包含以下内容 *a 123ab 1234 abcdef a? ? grep“a*”测试应匹配零次或多次出现的a,并按说明打印输出中测试文件的每一行。 该文档进一步说明,要匹配元字符,如*,必须在它们前面加反斜杠\,对它们进行转义。 但是grep'*'测试和grep'\*'测试的输出是相同的。输出:*a 为什么*不在前面加上\就匹配自身?*本

我正在学习
grep
atm,但我很难理解kleene-star元字符的工作原理。手册页说明
*
与前面的字符零次或多次匹配。我正在使用一个名为
test
的文件,其中包含以下内容

*a
123ab
1234
abcdef
a?
?
grep“a*”测试
应匹配零次或多次出现的
a
,并按说明打印输出中
测试
文件的每一行。 该文档进一步说明,要匹配元字符,如
*
,必须在它们前面加反斜杠
\
,对它们进行转义。 但是
grep'*'测试
grep'\*'测试
的输出是相同的。输出:
*a

为什么
*
不在前面加上
\
就匹配自身?

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

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

grep 'a*'
grep 'a\*'

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

正则表达式中的前导
*
根据上下文有效。鸣人,你的平台的正则表达式解释器在这里做的是正确的:
*
在正则表达式的开头不是特殊字符。

我认为
*a
不是有效的grep模式(因为它是无效的regexp)。grep如何在“未定义的行为”中处理这一点,实现可以做他们想做的事情(并且逐字逐句地处理初始的
*
),但是
grep'\*a'测试与之完美匹配。因为
\*a
是一个有效的正则表达式,所以我不愿意将某个东西称为无效的正则表达式,也不愿意谈论未定义的行为,除非您可以实际指向一个详细说明正则表达式如何工作的标准文档。特别是当各种实现之间存在巨大差异时。无效?具体根据什么标准?:-)@paxdiablo:我脑海中的那个恰好与普通正则表达式引擎的功能相匹配。