谁能告诉我下面示例中
*
和 +
运算符之间的区别:
[<>]+
[<>]*
它们都是量词,星号量词(
*
)表示前面的表达式可以匹配零次或多次,就像{0,}
一样,而加号量词(+
)表示前面的表达式必须至少匹配一次或多次,与 {1,}
相同。
回顾一下:
a* ---> a{0,} ---> Match a or aa or aaaaa or an empty string
a+ ---> a{1,} ---> Match a or aa or aaaa but not a string empty
*
表示零个或多个,+
表示一个或多个。所以区别在于空字符串将匹配第二个表达式,但不匹配第一个。
+
表示前一个原子的一个或多个。 ({1,}
)
*
表示零个或更多。 除了方括号表达式中指定的字符之外,它不能匹配任何内容。 ({0,}
)
请注意,
+
在扩展和 Perl 兼容正则表达式中可用,但在基本 RE 中不可用。 *
在所有三种 RE 方言中均可用。 您使用的方言很可能取决于您所使用的语言。
现代操作系统中唯一仍然默认使用 BRE 的是
grep
和 sed
(两者都具有 ERE 功能作为选项)和非 vim vi
。
*
表示零个或多个先前的表达式。
换句话说,表达式是可选的。
您可以像这样定义一个整数:
-*[0-9]+
换句话说,一个可选的负号后跟一个或多个数字。
它们是量词。
+
表示 1 或多个(至少出现一次匹配才能成功)*
表示 0 或多个(无论搜索字符串是否存在,匹配都会成功)[<>]+
与 [<>][<>]*
相同
我将举一些例子来扩展上面的答案。让我们有一个文本:
100test10
test10
test
如果我们写
\d+test\d+
,这个表达式匹配 100test10
和 test10
但 \d*test\d*
匹配其中的三个
关于@godot的回答。我相信
\d+test\d+
表达式不会匹配文本 test10
,只能匹配 100test10
。表达式开头的 \d+
表示前面的数字必须至少出现一次或多次,并且由于 test10 在 test
之前没有任何数字,因此不会匹配。