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引擎不会寻找最长的匹配,因此它对到目前为止匹配的内容感到满意,并立即停止并重新匹配将urns
fooE
作为匹配项,而不尝试其他替代方法
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[:])*/