php 正则表达式加与星差?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/8575281/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 05:01:48  来源:igfitidea点击:

Regex plus vs star difference?

phpregex

提问by David19801

What is the difference between:

有什么区别:

(.+?)

and

(.*?)

when I use it in my php preg_matchregex?

当我在我的 phppreg_match正则表达式中使用它时?

回答by stema

They are called quantifiers.

它们被称为量词。

*0 or more of the preceding expression

*0 个或多个前面的表达式

+1 or more of the preceding expression

+1 个或多个上述表达式

Per default a quantifier is greedy, that means it matches as many characters as possible.

默认情况下,量词是贪婪的,这意味着它匹配尽可能多的字符。

The ?after a quantifier changes the behaviour to make this quantifier "ungreedy", means it will match as little as possible.

?一个量词后改变行为,使这个量词“ungreedy”,意味着它会匹配尽可能少。

Example greedy/ungreedy

贪心/不贪心的例子

For example on the string "abab"

例如在字符串“ abab”上

a.*bwill match "abab" (preg_match_all will return one match, the "abab")

a.*b将匹配“abab”(preg_match_all 将返回一个匹配项,即“abab”)

while a.*?bwill match only the starting "ab" (preg_match_all will return two matches, "ab")

whilea.*?b将只匹配起始的“ab”(preg_match_all 将返回两个匹配项,“ab”)

You can test your regexes online e.g. on Regexr, see the greedy example here

您可以在线测试您的正则表达式,例如在 Regexr 上,请参阅此处的贪婪示例

回答by Quentin

The first (+) is one or more characters. The second (*) is zero or more characters. Both are non-greedy (?) and match anything (.).

第一个 ( +) 是一个或多个字符。第二个 ( *) 是零个或多个字符。两者都是非贪婪的 ( ?) 并且匹配任何东西 ( .)。

回答by DaveRandom

A +matches one or moreinstances of the preceding pattern. A *matches zero or moreinstances of the preceding pattern.

A+匹配前面模式的一个或多个实例。A*匹配前面模式的零个或多个实例。

So basically, if you use a +there must be at least one instance of the pattern, if you use *it will still match if there are no instances of it.

所以基本上,如果你使用 a+必须至少有一个模式实例,如果你使用*它,如果没有它的实例,它仍然会匹配。

回答by Xophmeister

+matches at least one character

+匹配至少一个字符

*matches any number (including 0) of characters

*匹配任意数量(包括 0)的字符

The ?indicates a lazy expression, so it will match as few characters as possible.

?指示慵懒的表情,所以它会匹配尽可能少的字符越好。

回答by Azri Jamil

Consider below is the string to match.

考虑下面是要匹配的字符串。

ab

The pattern (ab.*)will return a match for capture group with result of ab

该模式(ab.*)将返回捕获组的匹配结果为ab

While the pattern (ab.+)will not match and not returning anything.

虽然模式(ab.+)将不匹配并且不返回任何内容。

But if you change the string to following, it will return abafor pattern (ab.+)

但是如果将字符串更改为以下,它将返回aba模式(ab.+)

aba

回答by jeroen

+is minimal one, *can be zero as well.

+是最小的一,*也可以为零。

回答by Madara's Ghost

A star is very similar to a plus, the only difference is that while the plus matches 1 or more of the preceeding character/group, the start matches 0 or more.

星号与加号非常相似,唯一的区别是加号匹配 1 个或多个前面的字符/组,而开头匹配 0 个或多个。

回答by Miladiouss

In RegEx, {i,f}means "between ito fmatches". Let's take a look at the following examples:

在正则表达式,{i,f}意味着“之间i,以f匹配”。让我们看一下以下示例:

  • {3,7}means between 3 to 7 matches
  • {,10}means up to 10 matches with no lower limit (i.e. the low limit is 0)
  • {3,}means at least 3 matches with no upper limit (i.e. the high limit is infinity)
  • {,}means no upper limit or lower limit for the number of matches (i.e. the lower limit is 0 and the upper limit is infinity)
  • {5}means exactly 4
  • {3,7}意味着 3 到 7 场比赛
  • {,10}表示最多 10 场比赛,没有下限(即下限为 0)
  • {3,}表示至少 3 个匹配,没有上限(即上限为无穷大)
  • {,}表示匹配次数没有上限或下限(即下限为0,上限为无穷大)
  • {5}正好是 4

Most good languages contain abbreviations, so does RegEx:

大多数优秀的语言都包含缩写,RegEx 也是如此:

  • +is the shorthand for {1,}
  • *is the shorthand for {,}
  • ?is the shorthand for {,1}
  • +是简写 {1,}
  • *是简写 {,}
  • ?是简写 {,1}

This means +requires at least 1 match while *accepts any number of matches or no matches at all and ?accepts no more than 1 match or zero matches.

这意味着+需要至少 1 个匹配项,同时*接受任意数量的匹配项或根本不?接受匹配项,并且接受不超过 1 个匹配项或零个匹配项。

Credit: Codecademy.com

信用:Codecademy.com

回答by Crt

I think the previous answers fail to highlight a simple example:

我认为以前的答案未能突出一个简单的例子:

for example we have an array:

例如我们有一个数组:

numbers = [5, 15]

The following regex expression ^[0-9]+matches: 15only. However, ^[0-9]*matches both 5 and 15. The difference is that the +operator requires at least one duplicateof the preceding regex expression

以下正则表达式^[0-9]+匹配:15仅。但是,^[0-9]*两者都匹配5 and 15。不同之处在于+运算符需要至少一个前面的正则表达式的副本