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

4
我希望限制用户在字段中输入以下特殊字符:
œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İťı —¿„”*@ 换行符 回车符
这个列表将会添加更多的字符,但是我最终会有完整的受限列表。
但他可以输入某些外国字符,如äöüÄÖÜÿï等,除了字母数字字符、常见特殊字符等。
是否有一种简单的方法来构建一个正则表达式来实现这个功能。将不允许的字符添加到禁用列表中,如
[^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı — ¿ „ ” * @]+
似乎不起作用。
而且我没有完整的允许字符列表。即使我试图获取它也太长了,并且包括所有字符,如:
~`!#$%^&()[]{};':",.
以及某些外国字符。

哪种语言?Java/Perl等? - Brian Agnew
我不知道为什么在Apache Regexp中失败了,但是这个正则表达式在Java内置的正则表达式包中编译得很好。内置的正则表达式支持更加强大,因此即使你没有遇到这个问题,我也建议切换到它。 - Alan Moore
5个回答

1
你没有提到你使用的正则表达式“口味”。以下代码是否有效?
\A[^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı — ¿ „ ” * @]+\z

1
可以构建一个正则表达式来匹配不正确的字符,例如:
[œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı]

(我没有包含所有的字符,你可以理解一下!)

如果任何一个字符匹配,就是失败。

或者,如果你需要一个匹配有效输入的正则表达式,只需在括号前面加上一个脱字符号,像这样:

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

1
你可以使用正则表达式来实现,但为什么不尝试使用内置方法检查字符串中是否包含任何被禁止的字符呢?例如在 .NET 中,你可以使用 .Contains() 方法。
个人而言,我会创建一个允许的字符列表,然后只需检查你的字符串是否有任何不在列表中的字符即可。使用白名单将确保你没有遗漏任何“坏”字符。

1
我不会给你点踩,但是在这里使用正则表达式确实更加聪明,因为(a)编译后比检查字符列表更快,(b)如果未来需求发生变化,它更加灵活。 - Jason Cohen

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

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

如果可以的话,尽量使用内置的字符类转义代码(如果有的话)。

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

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

0
这个列表还会添加一些内容,但我最终将拥有完整的受限列表。
我没有完整的允许字符列表(即使我尝试获取它,也会太长,并且包括所有字符,如~`!#$%^&()[]{};':",.<>以及某些外语字符)。
你最终会拥有不允许字符的列表,而可能没有允许字符的列表?你必须拥有所有允许字符或所有不允许字符的列表。否则,你无法确定输入是否合法。此外,如果你拥有其中一个列表,则如果已知字符集,则隐含拥有第二个列表。然后只需实现较短的那个列表。
只是猜测,但如果你使用Unicode,你想要禁止的字符可能比允许的字符多得多——想想所有花哨的中日韩符号。因此,我认为你应该真正建立一个允许字符的列表,并使用像a-z这样的范围。

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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接