我刚刚编写了一个正则表达式,用于 php 函数 preg_match
,其中包含以下部分:
[\w-.]
匹配任何单词字符,以及减号和点。虽然它似乎在 preg_match 中工作,但我尝试将它放入一个名为 Reggy 的实用程序中。它提示“char 类中的空范围”。反复试验告诉我,这个问题是通过转义减号,将正则表达式变成
来解决的[\w\-.]
既然原来的似乎在 PHP 中工作,我想知道为什么我应该或不应该转义减号,并且 - 因为点也是 PHP 中具有含义的字符 - 为什么我不需要转义点。我使用的实用程序是不是很傻,它是在使用另一种正则表达式方言还是我的正则表达式真的不正确,我只是幸运 preg_match 让我侥幸逃脱?
最佳答案
在许多正则表达式实现中,适用以下规则:
字符类中的元字符是:
^
(否定)-
(范围)]
(类(class)结束)\
(转义字符)
所以这些都应该被转义。不过也有一些极端情况:
-
如果放在类的开头或结尾([abc-]
或[-abc]
)。在相当多的正则表达式实现中,直接放在范围([a-c-abc]
)或速记字符类([\w-abc]
)。这是你观察到的^
在类的开头是 not 时不需要转义:[^a]
表示除a 之外的任何字符
和[a^]
匹配a
或^
,等于:[\^a]
如果 ]
是类中唯一的字符,则不需要转义:[]]
匹配字符]
关于php - 应该在正则表达式中转义哪些文字字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484084/