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

时间:2010-12-22 15:38:55

标签: regex

我试图创建一个只允许字母大写或小写的正则表达式,以及空格字符' - ',',''。','('和')'。这是我到目前为止,但由于某种原因它仍然让我输入数字

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

任何帮助都会很棒!谢谢。

4 个答案:

答案 0 :(得分:13)

-在字符类中很特殊。它用于定义范围,就像您使用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之间,因为-(我们想要字面意思的那个)周围的两个字符都是{ {1}}和z已经涉及范围,A会再次被视为处理。

在所有提到的方法中,建议使用转义方法,因为它使您的代码更易于阅读和理解。任何看到-的人都会期望逃跑。如果您稍后在字符类之前(之后)添加字符而不转义\从而形成范围,则将-放在开头(结尾)会产生问题。

答案 1 :(得分:4)

嗯,有一个问题是-,被解释为范围,例如a-z,允许从空格到逗号的所有字符。逃避它,至少应修复一些错误。

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

严格地说,你也应该逃避.(),因为它们在正则表达式中具有特殊含义。无论如何,Javascript正则表达式引擎(我正在测试的地方)似乎在[]上下文中完全解释它们,但是明白它总是好得多。

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

但是,这仍然不应该允许0-9位数,因此使用这个正则表达式的实际代码也可能存在问题。

答案 2 :(得分:2)

 -,中的[a-zA-Z -,.()]描述了从 (0x20)到,(0x2C)的范围。这相当于[ !"#$%'()*+,]。您应该转义-或将其置于不被解释为范围指示符的其他位置。

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

答案 3 :(得分:0)

我用javascript尝试过,它运行正常。但其他人都是正确的。如果在javascript中,检查一切是否正常,否则检查根本不会发生。