企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## **独立表达式 (?>pattern) 也叫固化分组:** 在固化分组中,永远不会"交还"已经匹配的任何内容。固化分组还有一个重要的用途,尤其是能提高匹配的效率 成功匹配后,回溯时不会考虑这个匹配的字符 $pattern="\.(\d\d(?>[1-9]?))\d+" 一般匹配步骤: $subject=123.456; $pattern="/\.(\d\d[1-9]?)\d+/" 【\.】匹配".",匹配成功,把控制权给下一个【\d】, 【\d】匹配“4”成功,把控制权给第二个【\d】, 这个【\d】匹配“5”成功,然后,把控制权给了【[1-9]?】, 由于量词是【?(0次或者1次)】,正则表达式遵循“量词优先匹配”,而且,此处是【?】,还会留下一个回溯点。然后匹配"6"成功, 然后把控制权给【\d+】,【\d+】发现后面没字符了,最遵循“后进先出”规则,回到上一个回溯点,进行匹配, 这时,【[1-9]?】会交还出其匹配的字符“6”,【[1-9]?】匹配“6”成功。匹配完成了。 大家发现【(\d\d[1-9]?)】匹配的结果确是"45",并不是我们想要的“456”,“6”被【\d+】匹配去了。那么,我们该如何办呢? (/ab{1,3}c/"相对于"abbc"有回溯,而对于"abbbc"则无回溯 我的理解是在贪婪匹配成功后下一个规则不匹配则会在还是满足前一个规则的情况下进行回溯再次匹配下一个规则)