正则表达式中的顺序很重要


Order important in regex?

特别是关于这里的PHP preg_split,为什么这是有效的:

$words = preg_split("/['/'s,_-]+/", $string);

其中以下返回"preg_split()[function.preg split]:编译失败:偏移量为7的字符类中的范围无序":

$words = preg_split("/['s,_-'/]+/", $string);

请注意,唯一的区别是正则表达式中正斜杠的位置。

$words = preg_split("/['s,_-'/]+/", $string);的问题是-在此处指示无效的范围

PHP手册摘录:

减号(连字符)可用于指定字符类中的字符。例如,[d-m]匹配任何字母介于d和m之间,包括d和m。如果在类,它必须用反斜杠转义或出现在某个位置其中它不能被解释为指示一个范围,通常是类中的第一个或最后一个字符。

如果范围有效,即从索引较低的字符开始到索引较高的字符,则不会出现编译错误。但是,这里的范围是无效的,因为_的十进制代码点是95,而/的是47

试试['['s,'/-_']+][2],你会看到它捕捉到你不想匹配的东西。

这就是为什么您应该在字符类中转义连字符,或者将其放在其开头的末尾。这些是相同的正确正则表达式:['/'s,_-]+[-'/'s,_]+['/'-'s,_]+