【问题标题】:Regex only allow letters and some characters正则表达式只允许字母和一些字符
【发布时间】:2010-12-30 03:14:39
【问题描述】:

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

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

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

【问题讨论】:

  • 作为正则表达式标记的转义字符:.()
  • @Mathias E:在字符组中,您不必转义所有正则表达式标记。

标签: regex


【解决方案1】:

- 在字符类中是特殊的。它用于定义一个范围,就像您对 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】:

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

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

严格来说,您可能还应该转义 .(),因为它们在正则表达式中具有特殊含义。无论如何,Javascript 正则表达式引擎(我正在测试的地方)似乎在 [] 上下文中逐字解释它们,但明确的总是要好得多。

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

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

【讨论】:

  • 无需在字符类中转义.()。在字符类中,只有]\‍ 以及-^(都取决于位置)具有特殊含义。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    我用 javascript 试过了,效果很好。不过其他的都是对的。如果在 javascript 中,请检查是否一切正常,否则根本不会进行检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-19
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多