我刚被正则表达式弄湿,我在别人编写的PHP程序中遇到了这个问题:CCD_ 1。注意,短划线不是第一个字符,它前面有一个空格。
我无法理解它的意思。我知道括号内字符之间的短划线通常表示一个范围,即[a-z]匹配任何小写字符"a"到"z",但当短划线位于不同类型的字符之间时,它匹配什么?
我的第一个想法是,它只匹配任何空格或字母数字字符,但之后就不需要破折号了。我的第二个想法是它匹配空格、字母数字和破折号;但后来我意识到,短跑可能会逃跑,或者被移到前面或后面。
我在谷歌上搜索过,找不到任何关于在混合字符的字符类中使用破折号的信息。也许我用错了搜索词。
这可能会有所帮助:http://www.regular-expressions.info/charclass.html在"字符类内部的元字符"一节中,它说:
字符类中其他位置的连字符形成一个范围可能被解释为文字或错误。Regex这方面的口味很不一致。
我的猜测是,它被作为一个文字进行了预处理,所以正则表达式将匹配空格、连字符或''w。
作为参考,它在PCRE中看起来无效:Debugex演示
在PCRE参考文献§16中。我们发现:
- Perl在警告模式下为字符类发出警告例如[A-''d]或[A-[:digital:]]。然后将连字符视为升-als。PCRE没有警告功能,因此在这些情况下会出错因为它们几乎肯定是用户的错误
[ -'w]
在perl中产生警告,但在php中没有。
您的正则表达式[ -'w]
似乎放错地方了,因为它只匹配以下字符:
[ !"#$%&'()*+,./-]
由于-
出现在中间,它将充当空格(32)和第一个'w
(48)字符之间的范围。