正则表达式仅允许字母和一些字符。

12

我试图创建一个正则表达式,只允许大小写字母以及空格、'-'、','、'.'、'('和')'这些字符。这是我目前的进展,但出于某些原因,它仍然允许我输入数字。

^[a-zA-Z -,.()]*$

非常感谢任何帮助!谢谢。


2
转义正则表达式中的特殊字符:.() - Mathias E.
1
@ Mathias E:在字符组内,您不必转义所有的正则表达式标记。 - unholysampler
4个回答

19

- 在字符类中是特殊的。它用于像您使用 a-z 一样定义范围。

如果要匹配字面意义上的 -,您需要对其进行转义或将其放置在不起到范围操作符作用的位置:

^[a-zA-Z \-,.()]*$
         ^^ escaping \ 
或者
^[-a-zA-Z ,.()]*$
  ^ placing it at the beginning.
或者
^[a-zA-Z -,.()-]*$
              ^ placing it at the end.

有趣的是

^[a-z-A-Z -,.()]*$
     ^ placing in the middle of two ranges.
在最后一种情况下,- 被放置在 a-zA-Z 之间,因为包围 -(我们想要按字面处理的字符)的两个字符,即 zA,已经被包含在范围内,所以 - 再次被视为字面量。

在所有提到的方法中,转义方法是推荐的,因为它使您的代码更易于阅读和理解。任何看到 \ 的人都会认为这是一个意图进行转义的符号。如果将 - 放在开头(结尾),如果您稍后在字符类中添加一个未转义 - 的字符,则会出现问题,从而形成范围。


谢谢,工作完美。 - Kevinzie

5

嗯,问题在于-,被解释为一个范围,就像a-z一样,允许所有从空格到逗号的字符。转义它,至少可以修复一些错误。

^[a-zA-Z \-,.()]*$

严格来说,你可能也应该转义.(),因为它们在正则表达式中具有特殊含义。在我测试的Javascript正则表达式引擎中,在[]上下文中它们似乎会被字面解释,但最好还是显式地转义。

^[a-zA-Z \-,\.\(\)]*$

然而,这仍然不应该允许使用0-9数字,所以您实际使用这个正则表达式的代码可能存在问题。

在字符类中,不需要转义.()。在字符类中,只有]\以及-^(取决于位置)具有特殊含义。 - Gumbo

2

[a-zA-Z -,.()] 中, -, 描述了从   (0x20) 到 , (0x2C) 的范围。这与 [ !"#$%'()*+,] 等效。您应该转义 - 或将其放在其他地方,以免被解释为范围指示符。

但是这不是此问题的原因,因为数字是从 0x30 到 0x39。


0

我用JavaScript试过了,它很好用。不过其他人说的也是对的。如果使用JavaScript,请检查一切是否正常,否则检查将根本不会发生。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接