Php 什么';这些与perl兼容的正则表达式之间有什么区别?

Php 什么';这些与perl兼容的正则表达式之间有什么区别?,php,regex,Php,Regex,他的回答激起了我的好奇心 考虑: $string = "asfasdfasdfasdfasdf[[sometextomatch]]asfkjasdfjaskldfj"; $regex = "/\[\[(.+?)\]\]/"; preg_match($regex, $string, $matches); $regex = "/\[\[(.*)\]\]/"; preg_match($regex, $string, $matches); 我问这两个正则表达式之间的区别是什么。我得到的答案是“*

他的回答激起了我的好奇心

考虑:

$string = "asfasdfasdfasdfasdf[[sometextomatch]]asfkjasdfjaskldfj";

$regex = "/\[\[(.+?)\]\]/";
preg_match($regex, $string, $matches);

$regex = "/\[\[(.*)\]\]/"; 
preg_match($regex, $string, $matches);
我问这两个正则表达式之间的区别是什么。我得到的答案是“*”尽可能多地匹配任何字符0次或更多次, 和“+?”匹配任何字符1次或多次,次数越少越好

我读这些正则表达式的方式不同,所以我自己做了一些实验,但没有得出任何结论。Php.net说“?”相当于{0,1},因此可以重写

"/\[\[(.+?)\]\]/"
作为

或作为

或作为


他们会捕获不同的文本吗?区别在于一个更便宜吗?我是肛门吗?

独立的,
确实意味着
{0,1}
,但是,当它跟在类似
*
+
,或者
{3,6}
(例如),
的后面时,它完全意味着别的东西,那就是它做了最小的匹配。因此,不,您不能将
/\[\[(.+?)\]\]/
重写为
/\[\[((.+){0,1})\]\]/
:-)

单独来看,
确实意味着
{0,1}
,但是,当它跟在像
*
+
{3,6}
(例如),
这样的东西后面时,它完全意味着其他东西,这就是说它进行了最小的匹配。因此,不,您不能将
/\[\[(.+?)\]\]/
重写为
/\[\[((.+){0,1})\]\]/
:-)

The
只捕获一次(The
(0,1)
表示0到1次),其中as
*
将捕获它在字符串中出现的次数

如果你把
带到
大狗身上使用。
它会给你
大的
。其中as
将只匹配


将只捕获一次(
(0,1)
表示0到1次),其中,
*
将捕获它在字符串中出现的次数

如果你把
带到
大狗身上使用。
它会给你
大的
。其中as
将只匹配


举个例子,你会得到不同的结果:

foo [[bar]] baz [[quux]]
第一个正则表达式将匹配
[[bar]]
[[qux]]
,而第二个正则表达式将只匹配
[[bar]]baz[[qux]]

原因是懒惰(后缀为
)将匹配最小可能重复次数。正常贪婪模式将匹配最大可能重复次数:

但是,如果一个量词后面跟一个问号,那么它就不再贪婪,而是匹配尽可能少的次数,因此模式
/\*.*?\*/
对C注释的处理是正确的。各种量词的含义不会因其他原因而改变,只是匹配的首选数量。不要把问号的用法和它本身作为量词的用法混为一谈。因为它有两种用途,所以有时会出现双重效果,如在
\d???\d
中,它优先匹配一个数字,但如果这是其他模式匹配的唯一方式,则可以匹配两个


举个例子,你会得到不同的结果:

foo [[bar]] baz [[quux]]
第一个正则表达式将匹配
[[bar]]
[[qux]]
,而第二个正则表达式将只匹配
[[bar]]baz[[qux]]

原因是懒惰(后缀为
)将匹配最小可能重复次数。正常贪婪模式将匹配最大可能重复次数:

但是,如果一个量词后面跟一个问号,那么它就不再贪婪,而是匹配尽可能少的次数,因此模式
/\*.*?\*/
对C注释的处理是正确的。各种量词的含义不会因其他原因而改变,只是匹配的首选数量。不要把问号的用法和它本身作为量词的用法混为一谈。因为它有两种用途,所以有时会出现双重效果,如在
\d???\d
中,它优先匹配一个数字,但如果这是其他模式匹配的唯一方式,则可以匹配两个


通常,
表示“捕获前面的内容0或1次”。但是,当在
*
+
之后使用时,
会修改
*
+
的含义。通常,
*
/
+
表示“匹配0(1表示+)或更多次,并尽可能多地匹配”。添加
将该含义修改为“匹配0(1+或更多次,但匹配次数尽可能少”。默认情况下,这些表达式是“贪婪的”,
将它们修改为非贪婪的。

通常,
表示“捕获前面的内容0或1次”。但是,当在
*
+
之后使用时,
会修改
*
+
的含义。通常,
*
/
+
表示“匹配0(1表示+)或更多次,并尽可能多地匹配”。添加
将该含义修改为“匹配0(1+或更多次,但匹配次数尽可能少”。默认情况下,这些表达式是“贪婪的”,
将它们修改为非贪婪的。

/.*/   ===  /.{0,}/
/.+/   ===  /.{1,}/
/.?/   ===  /.{0,1}/


谢谢你的回答!我想知道我写过多少破坏的正则表达式忽略了这个重要的细节。我给了秋波支票,因为那个答案对我来说是最清楚的。谢谢所有的答案!我想知道我写过多少破坏的正则表达式忽略了这个重要的细节。我给秋葵开了支票,因为答案对我来说是最清楚的。
foo [[bar]] baz [[quux]]
/.*/   ===  /.{0,}/
/.+/   ===  /.{1,}/
/.?/   ===  /.{0,1}/
"aaaaaa" =~ /a*/;  # "aaaaaa"
"aaaaaa" =~ /a*?/; # ""