正则表达式中混合字符之间的短划线的含义


Meaning of a dash between mixed characters in regex?

我刚被正则表达式弄湿,我在别人编写的PHP程序中遇到了这个问题:CCD_ 1。注意,短划线不是第一个字符,它前面有一个空格。

我无法理解它的意思。我知道括号内字符之间的短划线通常表示一个范围,即[a-z]匹配任何小写字符"a"到"z",但当短划线位于不同类型的字符之间时,它匹配什么?

我的第一个想法是,它只匹配任何空格或字母数字字符,但之后就不需要破折号了。我的第二个想法是它匹配空格、字母数字和破折号;但后来我意识到,短跑可能会逃跑,或者被移到前面或后面。

我在谷歌上搜索过,找不到任何关于在混合字符的字符类中使用破折号的信息。也许我用错了搜索词。

这可能会有所帮助:http://www.regular-expressions.info/charclass.html在"字符类内部的元字符"一节中,它说:

字符类中其他位置的连字符形成一个范围可能被解释为文字或错误。Regex这方面的口味很不一致。

我的猜测是,它被作为一个文字进行了预处理,所以正则表达式将匹配空格、连字符或''w。

作为参考,它在PCRE中看起来无效:Debugex演示

在PCRE参考文献§16中。我们发现:

  1. Perl在警告模式下为字符类发出警告例如[A-''d]或[A-[:digital:]]。然后将连字符视为升-als。PCRE没有警告功能,因此在这些情况下会出错因为它们几乎肯定是用户的错误

[ -'w]在perl中产生警告,但在php中没有。

您的正则表达式[ -'w]似乎放错地方了,因为它只匹配以下字符:

[ !"#$%&'()*+,./-]

由于-出现在中间,它将充当空格(32)和第一个'w(48)字符之间的范围。