为什么 grep -E '[ab]*' 不匹配任何内容?

问题描述 投票:0回答:1

我认为这是对 * 在正则表达式中的作用的根本误解,但我在任何地方都找不到我的问题的可靠答案...... 所有来源都说 * 匹配 0 次或多次重复的之前的字符/字符类(当然,当它本身在字符类之外使用时)。但这不是意味着它应该匹配所有内容吗?

例如,考虑一下,

grep -E "[ab]*"
这不应该匹配任何内容吗,因为任何内容都包含 0 个或多个 a 或 b 实例?例如,“apple”包含 1 个实例,“joseph”包含 0 个实例...

regex shell grep glob
1个回答
0
投票

您对正则表达式的理解是正确的。

[ab]*
表示一组字符串,其中包括空字符串。

您缺少的是某些工具以某些方式使用正则表达式。

grep
的情况下,该工具会查找正则表达式的 非空 匹配项。

它会事后猜测用户。当然,您并不是说要匹配每个文件的每个字符之前/之后的空位置;这不是很有用。

您有时会遇到接受空匹配的工具,例如在正则表达式上分割字符串的函数,就像这种编程语言中的函数一样:

1> (spl #/[ab]*/ "xyzw")
("x" "y" "z" "w")

请注意,这也有其自身的特点!正则表达式肯定会匹配

x
之前和
w
之后的空位置。所以可以设计一个这样的函数,这样输出就是
("" "x" "y" "z" "w" "")

这不仅仅是函数忽略与开始或结束相邻的匹配的情况,因为,看:

2> (spl #/[xw]/ "xyzw")
("" "yz" "")

x
w
非常匹配,结果是空的棋子。

这只是正则表达式在自动机理论中的含义与其应用方式之间的对比的另一个例子。

您始终必须牢记如何将理论应用到您正在使用的工具中。

© www.soinside.com 2019 - 2024. All rights reserved.