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*?/; # ""