正则表达式允许一组字符并禁止其他字符

时间:2009-04-01 14:06:10

标签: java regex

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

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

此列表中还会添加更多内容,但我最终会拥有完整的限制列表。

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

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

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

似乎不起作用。

我没有完整的允许字符列表。即使我试图得到它也会太长,并且会包括所有字符:

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

以及某些外国人。

5 个答案:

答案 0 :(得分:1)

你没有提到你正在使用的正则表达的“味道”。以下是否有效?

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

答案 1 :(得分:1)

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

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

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

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

  

此列表中还会添加更多内容,但我将拥有完整的限制列表     最终

     

而且我没有完整的允许字符列表(即使是这样也会太长   我试图得到它,并将包括所有字符,如〜!#$%^&()[] {};':“,。<> withwith   某些外国人)

您最终会获得不允许使用的字符列表,也可能不包含允许字符列表? 您必须拥有所有允许字符的列表或所有不允许字符的列表。否则您无法判断输入是否合法。此外,如果您有一个列表,如果已知字符集,则隐式地具有第二个列表。然后实现较短的一个。

只是猜测,但是如果你使用Unicode,你可能会有更多的字符要禁止而不允许 - 想想所有花哨的Chinees和Japanes符号。所以我认为你应该真正建立一个允许的字符列表,并使用像 a-z 这样的范围。

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

  

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

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

答案 4 :(得分:0)

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

[^a-z]

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

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

Perl RE here找到它们,寻找“角色类和其他特殊躲避”。它可能允许你有一个像这样的较短的表达。

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