2010-12-22 256 views
8

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

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

任何帮助将是伟大的!谢谢。

+2

转义为正则表达式标记的字符:。() – 2010-12-22 15:40:38

+1

@ Mathias E:在字符组内部,您不必转义所有正则表达式标记。 – unholysampler 2010-12-22 15:45:14

+0

这真的是你实际使用的正则表达式吗? – Gumbo 2010-12-22 15:46:36

回答

3

好吧,有一个问题,-,被解释为一个范围,如a-z,允许从空间到逗号的所有字符。逃避并至少应该修复一些错误。

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

严格地说,你应该也难逃.(),也因为那些在正则表达式的特殊含义。 Javascript正则表达式引擎(我正在测试的)似乎在[]的上下文中直接解释它们,但总是明确得多。

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

然而,这仍然不应该被允许0-9数字,因此您的实际代码,使用这个正则表达式可能有一些问题,以及。

12

-是特殊的字符类。它用于定义一个范围,如您对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已经参与范围,在-人物简直是再处理。

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

2

 -, in [a-zA-Z -,.()]描述从 (0x20)到,(0x2C)的范围。这相当于[ !"#$%'()*+,]。您应该跳过-或将其放置在不被解释为范围指示符的地方。

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

0

我试过用JavaScript,它工作正常。其他人都是正确的,但。如果在JavaScript中,检查是否一切正常,否则检查不会发生。

相关问题