正则表达式中混合字符之间的破折号的含义?

时间:2014-10-22 14:41:41

标签: php regex

我刚刚用正则表达式弄湿了我在其他人写过的PHP程序中遇到了这个问题: [ -\w]。请注意,破折号不是第一个字符,前面有一个空格。

我不能做出它意味着什么的正面或反面。我知道括号内字符之间的短划线通常表示一个范围,即[a-z]匹配任何小写字符" a"通过" z",但是当短划线位于不同类型的角色之间时它会匹配什么?

我的第一个想法是,它只匹配任何空格或字母数字字符,但那么破折号就没有必要了。我的第二个想法是,它匹配空间,字母数字和仪表板;但后来我意识到,破折号可能会被转移或移动到前面或后面。

我已经用Google搜索了,并且无法找到在带有混合字符的字符类中使用短划线的任何信息。也许我使用了错误的搜索字词。

3 个答案:

答案 0 :(得分:2)

这可能会有所帮助:http://www.regular-expressions.info/charclass.html在“字符类中的元字符”部分中说:

  

在角色类别的其他位置连接它们不能的连字符   表单范围可以解释为文字或错误。正则表达式   味道与此非常不一致。

我的猜测是它被解释为文字,因此正则表达式将匹配空格,连字符或\ w。

作为参考,它在PCRE中看起来无效: Debuggex Demo

答案 1 :(得分:1)

PCRE reference§16中。我们发现:

  
      
  1. Perl,处于警告模式时,会为字符类提供警告      例如[A- \ d]或[a - [:digit:]]。然后它将连字符视为升 -      阿尔斯。 PCRE没有警告功能,因此在这些情况下会出错      因为他们几乎肯定是用户错误。
  2.   

[ -\w]在perl中生成警告但在php中没有。

答案 2 :(得分:0)

你的正则表达式[ -\w]似乎是一个错位的,因为它只匹配这样的字符:

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

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