【问题标题】:Regular expression to allow a set of characters and disallow others允许一组字符并禁止其他字符的正则表达式
【发布时间】:2009-04-01 14:06:09
【问题描述】:

我想限制用户在字段中输入以下特殊字符:

œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ 伊兹 ——¿„”*@ 新队 回车

还会在此列表中添加一些,但我最终会拥有完整的受限列表。

但除了字母数字字符、通常的特殊字符等之外,他还可以输入某些外来字符,例如 äöüÄÖÜÿï 等。

有没有一种简单的方法来构建一个正则表达式来做到这一点。在不允许的列表中添加这么多字符,例如

[^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı — ¿ „ ” * @]+

似乎不起作用。

而且我没有允许的字符的完整列表。即使我尝试获取它也会太长并且会包含所有字符,例如:

~`!#$%^&()[]{};':",.

以及某些外国字符。

【问题讨论】:

  • 哪种语言? Java/Perl 等?
  • 我不知道为什么它在 Apache Regexp 中失败了,但是该 regex 在 Java 的内置 regex 包中编译得很好。内置的正则表达式支持更强大,因此即使您没有遇到此问题,我也建议您切换到它。

标签: java regex


【解决方案1】:

您没有提及您使用的正则表达式的“风味”。以下是否有效?

\A[^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı — ¿ „ ” * @]+\z

【讨论】:

    【解决方案2】:

    可以构建正则表达式来匹配不正确的字符,例如:

    [œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı]
    

    (我没有包括所有角色;你明白了!)。

    如果有任何字符匹配,则失败。

    或者,如果您需要一个匹配 有效 输入的正则表达式,只需在括号前面添加一个插入符号,如下所示:

    [^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı]*
    

    【讨论】:

      【解决方案3】:

      您可以为此使用正则表达式,但为什么不使用内置方法检查字符串中是否有任何不允许的字符呢?例如,在 .NET 世界中,您可以使用 .Contains()。

      就个人而言,我会创建一个允许的字符列表,然后检查您的字符串是否没有任何不在列表中的字符。使用白名单将确保您也没有忘记任何“坏”字符。

      【讨论】:

      • 我不会对你投反对票,但这里的正则表达式确实更聪明,因为 (a) 编译后它比检查字符列表更快,并且 (b) 如果需求发生变化,它会更灵活未来。
      【解决方案4】:

      还有一些将添加到此列表中,但我将拥有完整的受限列表 最终。

      而且我没有完整的允许字符列表(即使 我尝试获取它,并将包括所有字符,如 ~`!#$%^&()[]{};':",. 以及 某些外国字符)

      您最终会得到不允许的字符列表,而可能没有允许的字符列表? 您必须拥有所有允许字符的列表或所有不允许字符的列表。否则您无法判断输入是否合法。此外,如果您有其中一个列表,则如果字符集已知,则隐含第二个。然后只需实现较短的那个。

      只是猜测,但如果您使用 Unicode,您想要禁止的字符可能比允许的字符多得多 - 想想所有花哨的中国和日本符号。所以我认为你真的应该建立一个允许的字符列表,并在可能的地方使用像 a-z 这样的范围。

      如果你真的想建立不允许的字符列表,你必须建立一个正则表达式,如 [^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı — ¿ „ ” * @]*。如果需要,不要忘记转义字符并尽可能使用范围。

      在不允许的列表中添加这么多字符,例如 [^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı — ¿ „ ” *@]+ 似乎不起作用。

      您的列表中有空格。它们也在你的代码中吗?我不确定,但这可能是个问题。

      【讨论】:

        【解决方案5】:

        最好通过否定允许的集合来尝试匹配任何不允许的字符。例如,如果您只想允许 'a' 到 'z',则可以执行以下操作。

        [^a-z]
        

        您不可能知道所有不允许允许的字符,但您大概知道允许的字符。因此,构建一个像上面那样的正则表达式,它只匹配一个不在允许集中的字符。如果你得到一个匹配,你就会知道这个字符串包含一个无效的字符。

        如果可以,请尝试使用可用的内置字符类转义码。

        Perl RE here 查找它们,查找“字符类和其他特殊转义”。它可以让你有一个像这样更短的表达式。

        [^\w\d  ..other individual chars..  ]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-02
          • 1970-01-01
          • 1970-01-01
          • 2017-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多