我刚刚用正则表达式弄湿了我在其他人写过的PHP程序中遇到了这个问题:
[ -\w]
。请注意,破折号不是第一个字符,前面有一个空格。
我不能做出它意味着什么的正面或反面。我知道括号内字符之间的短划线通常表示一个范围,即[a-z]匹配任何小写字符" a"通过" z",但是当短划线位于不同类型的角色之间时它会匹配什么?
我的第一个想法是,它只匹配任何空格或字母数字字符,但那么破折号就没有必要了。我的第二个想法是,它匹配空间,字母数字和仪表板;但后来我意识到,破折号可能会被转移或移动到前面或后面。
我已经用Google搜索了,并且无法找到在带有混合字符的字符类中使用短划线的任何信息。也许我使用了错误的搜索字词。
答案 0 :(得分:2)
这可能会有所帮助:http://www.regular-expressions.info/charclass.html在“字符类中的元字符”部分中说:
在角色类别的其他位置连接它们不能的连字符 表单范围可以解释为文字或错误。正则表达式 味道与此非常不一致。
我的猜测是它被解释为文字,因此正则表达式将匹配空格,连字符或\ w。
作为参考,它在PCRE中看起来无效: Debuggex Demo
答案 1 :(得分:1)
在PCRE reference§16中。我们发现:
- Perl,处于警告模式时,会为字符类提供警告 例如[A- \ d]或[a - [:digit:]]。然后它将连字符视为升 - 阿尔斯。 PCRE没有警告功能,因此在这些情况下会出错 因为他们几乎肯定是用户错误。
醇>
[ -\w]
在perl中生成警告但在php中没有。
答案 2 :(得分:0)
你的正则表达式[ -\w]
似乎是一个错位的,因为它只匹配这样的字符:
[ !"#$%&'()*+,./-]
由于-
出现在中间,它将充当空格(32)和第一个\w
(48)个字符之间的范围。