Php “非贪婪通配符”;“忽略”;

Php “非贪婪通配符”;“忽略”;,php,regex,preg-match,regex-greedy,Php,Regex,Preg Match,Regex Greedy,我得到了以下情况: ... preg_match('/#(.+?):(.+?)#/im','partA#partB#partC:partD#partE#partF',$matches); ... 执行后,$matches变为 Array ( [0] => #partB#partC:partD# [1] => partB#partC [2] => partD ) 如果我使用非贪婪的通配符,$match

我得到了以下情况:

...    
preg_match('/#(.+?):(.+?)#/im','partA#partB#partC:partD#partE#partF',$matches);
...
执行后,$matches变为

 Array
    (
        [0] => #partB#partC:partD#
        [1] => partB#partC
        [2] => partD
     )
如果我使用非贪婪的通配符
$matches[1]
变成
partC
不是很正常吗?
?我错过什么了吗

我通过使用
”/#([^#]+?):([^#]+?)#/im'
作为模式来解决这个问题,但是一个相关的解释将非常有助于清除云层


谢谢。

捕获组1正在寻找
#
然后是任何东西(不包括新行),直到第一个
。因此,
partB#partC
是有意义的

您的修改器也没有做任何事情。您没有区分大小写的字母,也没有使用锚


您可以在这里看到正则表达式是如何处理的。

当您考虑正则表达式背后的基本理论时,这是有意义的

正则表达式被称为正则表达式。这意味着,从本质上讲,它将从左到右一次处理字符串一个字符,偶尔通过“放弃”字符来向后处理。在您的示例中,正则表达式看到第一个
,并注意到
没有参与模式的任何其他部分,开始匹配下一个标记(
+?
,在您的示例中)。它会这样做,直到碰到冒号,然后匹配下一个标记(同样,
+?
)。因为它是从左到右的,所以它将匹配第一个散列,然后停止,因为它是懒惰的

这实际上是一个常见的误解-量词的
修饰符不是非贪婪的,而是懒惰的。它将匹配从左到右的最小可能字符串

要修复原始正则表达式,您可以对其进行如下修改:

/.+#(.+?):(.+?)#/im
这将在冒号之前的最后一个哈希之前使用贪婪匹配,强制第一个捕获组只使用该哈希和冒号之间的内容。同样,该组也不需要lazy修饰符,从而生成最终正则表达式:

/.+#(.+):(.+?)#/im

实际上,您可以使用
“/”([^:]+):([^.]+)。/”
。主要的一点是,惰性量词不能保证最短匹配,正则表达式引擎(默认)从左到右处理字符串。找到有效符号后,将从最左侧位置向右尝试图案的其余部分。因此,
partB#partC
适合
。为了更好地理解,正则表达式引擎从左到右搜索字符串,并尝试在字符串中的每个位置成功。我在正则表达式中看到了
。3月15日日,来自现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场现场35月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月月日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日日###:#def'。是你看到了《代码》:。原因是这就是你想看到的,这是人的本性。真的,没有任何迹象表明这里出了什么问题。你认为这是不对的。谢谢sln,你让我开心了:)。是的,我相信我看到了事实上不存在的东西。是的,我现在明白为什么它会这样对待它,这是有道理的。谢谢你在修饰符上的注释。谢谢你发现了非贪婪/懒惰的区别。拉达契娜:如果答案有帮助,通常是打开的,这样你就可以用投票箭头旁边的复选标记按钮将其标记为问题的答案。这有助于其他人找到他们问题的答案,因为这样他们就不必搜索问题的整个答案部分。