*和+正则表达式的区别

34
有人能告诉我下面示例中 *+ 运算符的区别吗? [<>]+ 表示匹配一个或多个 <> 符号。 [<>]* 表示匹配零个或多个 <> 符号。
7个回答

60

它们都是量词,星号量词(*)表示前面的表达式可以匹配零次或多次,就像 {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

6
这个答案已经添加到了Stack Overflow 正则表达式 FAQ下的“量词”一节。 - aliteralmind
我在@aleroot中未找到与空字符串匹配的内容。 - logbasex
结果是相同的。 - logbasex

13

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


4
这不是反过来了吗?*可以匹配空值,但是+不能。 - Joshua Plicque
1
我相信Ismail所提到的是OP的样本模式([<>]+[<>]*),而不是在这个答案中讨论的量词顺序。 我同意,它有点模棱两可。 - mickmackusa

7

+ 表示前一个元素出现一次或多次。({1,}

* 表示零次或多次匹配。除了在方括号表达式中指定的字符外,此模式还可以匹配空字符串。({0,}

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

现代操作系统中仅有默认使用BRE的是grepsed(两者都具有ERE选项功能),以及非vim的 vi


5

* 代表前一个表达式可以出现零次或者多次。

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

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

-*[0-9]+

也就是说,可选的负号后面跟着一或多个数字。


4

它们是量词。

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

3

[<>]+ is same as [<>][<>]*


2

我将举例来扩展上面的答案。假设我们有一段文本:

100test10
test10
test

如果我们编写\d+test\d+,则该表达式匹配100test10test10,但\d*test\d*与它们三个都匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接