Php 字符类在正则表达式中交替出现的奇怪行为
我正在尝试编写一个简单的正则表达式,它可以识别不是列或转义列的字符序列。 即: 但是 根据我对正则语言的了解,这种语言可以用正则表达式来描述Php 字符类在正则表达式中交替出现的奇怪行为,php,regex,Php,Regex,我正在尝试编写一个简单的正则表达式,它可以识别不是列或转义列的字符序列。 即: 但是 根据我对正则语言的了解,这种语言可以用正则表达式来描述 /([^:]|\\[:])*/ 您可以在奇妙的工具中看到此表达式的图形表示 使用php的preg_match(基于引擎),这样的表达式与“foo\:bar”不匹配 但是,如果用单个字符替换该类: /([^:]|\\:)*/ 表达式匹配 你对此有什么解释吗?这是PCRE引擎对角色类的一种限制吗 PS:在上测试基于AS3 Regexp引擎的第一个表达式时,
/([^:]|\\[:])*/
您可以在奇妙的工具中看到此表达式的图形表示
使用php的preg_match
(基于引擎),这样的表达式与“foo\:bar”不匹配
但是,如果用单个字符替换该类:
/([^:]|\\:)*/
表达式匹配
你对此有什么解释吗?这是PCRE引擎对角色类的一种限制吗
PS:在上测试基于AS3 Regexp引擎的第一个表达式时,在更改替换顺序时不提供匹配:
/(\\[:]|[^:])*/
它确实匹配,而同一表达式在PCRE中不匹配。您可以尝试此方法。这允许第二个字符
\\:
在被求反的字符类[^::][/code>之前有一个机会
^(?:\\:|[^:])+$
如果使用替换条中的值,如^((?:[^:][^:][124;\\:)+$
中所示,则它将不匹配转义冒号\:
,因为第一个替换项将使用斜杠(\
)在第二个表达式有机会尝试之前。接受正则表达式模式作为字符串,因此需要双重转义所有内容
^(?:[^:\\\\]|\\\\:)+$
这将匹配一个或多个非冒号或转义字符[^:\\\\\]
,或转义冒号\\\\\:
第一个正则表达式不起作用的原因:/([^:][124;\\[:])*/
它匹配一个非冒号[^:::][/code>,或者它匹配一个匹配文本[
的\[:]
,然后是一个文本]
为什么这样做:/([^:][124;\\:)*/
它匹配一个非冒号[^::]
,或者它匹配一个文本\\:
,因此它有效地匹配所有内容
^(?:[^:\\\\]|\\\\:)+$
编辑:为什么/([^:]| E[:])*/
与fooE:bar
不匹配
事情就是这样:[^:]
匹配f
然后匹配o
然后匹配另一个o
然后匹配E
,现在它找到一个冒号:
并且它不能匹配它,但是由于默认情况下PCRE引擎不会寻找最长的匹配,因此它对到目前为止匹配的内容感到满意,并立即停止并重新匹配将urnsfooE
作为匹配项,而不尝试其他替代方法E[:]
(这与E:
)完全相同
如果要匹配整个序列,则需要使用如下表达式:
/([^:E]|E[:])*/
这可以防止[^::][/code>使用标记为PHP的E
问题。您是否考虑过反斜杠是PHP字符串中的转义字符?是的,当然,我尝试了所有组合和非“\”转义字符…:)@阿尔瓦罗格·维卡里奥:我认为这是问题的根源problem@CasimiretHippolyte表达式/([^:]| E[:])*/
的行为也一样。但是改变顺序,用/(E[:]|[^:]*//code>,它匹配…@lvaroG.Vicario:因为在第一个表达式中,E
被[^:]
吃掉,必须停在:
,但在第二个表达式中,E
被E[:]吃掉
使用:
和regex引擎可以继续。在问题中,我已经发布了一个匹配的表达式。但是我想知道原始表达式中的问题是什么。我没有语法错误,用一个无问题的转义字符替换“\”,问题仍然存在。例如,/([^:]| E[:])*/
与fooE:bar
@NicolòMartini检查我的最终编辑,它解释了问题。如果您需要更多的解释,请告诉我。您是否查看了我的最后评论?:)@NicolòMartini你差点把我甩了,我会编辑我的答案,告诉你为什么/([^:]| E[:])*/
与fooE:bar
不匹配。
/([^:E]|E[:])*/