Regex 正则表达式:/.+;?/工作
“+?”正则表达式如何工作?.+部分是否与所写内容匹配,以及?部分是说它要么存在要么不存在?例如,这个正则表达式将匹配: “猫”Regex 正则表达式:/.+;?/工作,regex,Regex,“+?”正则表达式如何工作?.+部分是否与所写内容匹配,以及?部分是说它要么存在要么不存在?例如,这个正则表达式将匹配: “猫” ''(即,没有写入任何内容,只有空字符串)+?(lazy plus) 重复上一项一次或多次 更多懒惰,所以引擎第一 仅与上一项匹配一次, 在尝试使用ever进行排列之前 增加前面的匹配项 项目 /“+?”/匹配abc“def”“ghi”jkl中的“def”(和“ghi”),而/“+”/匹配“def”“ghi” 您可以找到更多信息“+?”不是后跟“+”量词的“+”量词。
''(即,没有写入任何内容,只有空字符串)+?(lazy plus) 重复上一项一次或多次 更多懒惰,所以引擎第一 仅与上一项匹配一次, 在尝试使用ever进行排列之前 增加前面的匹配项 项目
/“+?”/
匹配abc“def”“ghi”jkl中的“def”(和“ghi”),而/“+”/
匹配“def”“ghi”
您可以找到更多信息“+?”不是后跟“+”量词的“+”量词。而是“?”修改“+”以执行“惰性”或“非贪婪”匹配,这意味着匹配的字符数已经足够了
因此,一个“a+?”正则表达式将只匹配“caaat”中的一个“a”。除了Hans Kesting已经说过的,一个懒惰的乘法器将与正常的贪婪乘法器完全相同:可能的匹配将保持尽可能小,其余的正则表达式将被测试 因此,如果使用字符串
aaba
并在其上测试正则表达式a.*b
,内部处理步骤如下:
a
中的a
*b
匹配a
aba
*
在a
*
b
中,匹配a
,并且由于*/code>是贪婪的
*
然后匹配a
ab
a
*
然后匹配a
aba
a.*
b
中的b
失败,因为没有剩余的字母
- 回溯向后退一步,
现在只匹配*
a中的
bb
ab
a
b
在a.*
b
中,在aab
a
- 回溯返回一步,
现在只匹配*
a
a
b
在a.*
b
现在匹配aa
b
中的b
a
,我们完成了
aab
a
如果我们对惰性乘法器(a.*b
)执行相同的操作,则处理将执行以下操作:尽量匹配尽可能少的字符:
a
中的
*?b
匹配a
aba
*
在a
*
中,b
不匹配任何内容(*
=零次或多次重复),并且由于*
被声明为惰性(*?
),因此对正则表达式的其余部分进行测试
a.*中的
在a
a
- 回溯将尝试增加
*
*
现在匹配a
a
b
在a.*.
b
匹配aa
b
a
,我们完成了
因此完全匹配如果
aab
a
有关于Perl如何处理这些量词的文档
默认情况下,量化的子模式是“贪婪的”,也就是说,它将尽可能多地匹配(给定特定的起始位置),同时仍然允许模式的其余部分匹配。如果您希望它匹配尽可能少的次数,请在量词后面加一个“?
”。请注意,含义不会改变,只是“贪婪”:
正如我们所知,如果最终报价不匹配,回溯将无济于事。有关详细信息,请参见独立子表达式(?>…)
;所有格量词只是该结构的句法糖分。例如,上面的例子也可以写成如下:
/"(?>(?:(?>[^"\\]+)|\\.)*)"/
正则表达式不可避免地要查找至少一个字符。我遇到过这样的情况:空字符串无法通过测试,最好使用
*?
或(*)?
相反,有时您必须在问号前的大括号中指定字符串中可能为空的部分,这会有所帮助。例如,\d{6}?
将产生错误的结果,而如果我在字符串中说了(\d{6})
,例如:
preg_match("/shu\.(\d{6})?/", "shu.321456")
这将产生
true
,字符串“shu.”
在句点后没有任何int最初的例子中的引号让我感到困惑——我以为它们只是从文本中设置了模式,而不是模式的一部分。我认为添加斜线可以澄清意图。正如Svish显然编辑的那样,/+?“/将同时匹配“def”和“ghi”,对吗?分别地因此它将返回两个表达式。而/“+”/捕获了整个短语“def”“ghi”,将def”“ghi计算为.+部分?@hatorade,据我所知,在RegexBuddy中测试它,是的。@Svish我在python和?似乎只是返回“def”,没有提及
*+ Match 0 or more times and give nothing back
++ Match 1 or more times and give nothing back
?+ Match 0 or 1 time and give nothing back
{n}+ Match exactly n times and give nothing back (redundant)
{n,}+ Match at least n times and give nothing back
{n,m}+ Match at least n but not more than m times and give nothing back
'aaaa' =~ /a++a/
/"(?:[^"\\]++|\\.)*+"/
/"(?>(?:(?>[^"\\]+)|\\.)*)"/
preg_match("/shu\.(\d{6})?/", "shu.321456")