* 和 + 正则表达式之间的区别

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

谁能告诉我下面示例中

*
+
运算符之间的区别:

[<>]+
[<>]*

regex
8个回答
62
投票

它们都是量词,星号量词(

*
)表示前面的表达式可以匹配零次或多次,就像
{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

14
投票

*
表示零个或多个,
+
表示一个或多个。所以区别在于空字符串将匹配第二个表达式,但不匹配第一个。


8
投票

+
表示前一个原子的一个或多个。 (
{1,}
)

*
表示零个或更多。 除了方括号表达式中指定的字符之外,它不能匹配任何内容。 (
{0,}
)

请注意,

+
在扩展和 Perl 兼容正则表达式中可用,但在基本 RE 中不可用。
*
在所有三种 RE 方言中均可用。 您使用的方言很可能取决于您所使用的语言。

现代操作系统中唯一仍然默认使用 BRE 的是

grep
sed
(两者都具有 ERE 功能作为选项)和非 vim
vi


5
投票

*
表示零个或多个先前的表达式。

换句话说,表达式是可选的。

您可以像这样定义一个整数:

-*[0-9]+

换句话说,一个可选的负号后跟一个或多个数字。


5
投票

它们是量词。

  • +
    表示 1 或多个(至少出现一次匹配才能成功)
  • *
    表示 0 或多个(无论搜索字符串是否存在,匹配都会成功)

3
投票

[<>]+
[<>][<>]*

相同

2
投票

我将举一些例子来扩展上面的答案。让我们有一个文本:

100test10
test10
test

如果我们写

\d+test\d+
,这个表达式匹配
100test10
test10
\d*test\d*
匹配其中的三个


0
投票

关于@godot的回答。我相信

\d+test\d+
表达式不会匹配文本
test10
,只能匹配
100test10
。表达式开头的
\d+
表示前面的数字必须至少出现一次或多次,并且由于 test10 在
test
之前没有任何数字,因此不会匹配。

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