Java 正则表达式以允许一组字符而不允许其他字符
我想限制用户在字段中输入以下特殊字符: œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İťı —¿„”*@ Newline Carriage return 似乎不起作用 我没有完整的允许字符列表。即使我尝试获取它,它也会太长,并且会包含所有字符,如: ~`!#$%^&()[]{};':",. ~`!#$%^&()[]{};':",. 与某些外来字符一起使用。您没有提到您正在使用的正则表达式的“味道”。以下方法有效吗Java 正则表达式以允许一组字符而不允许其他字符,java,regex,Java,Regex,我想限制用户在字段中输入以下特殊字符: œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İťı —¿„”*@ Newline Carriage return 似乎不起作用 我没有完整的允许字符列表。即使我尝试获取它,它也会太长,并且会包含所有字符,如: ~`!#$%^&()[]{};':",. ~`!#$%^&()[]{};':",. 与某些外来字符一起使用。您没有提到您正在使用的正则表达式的“味道”。以下方法有效吗 \A[^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı —
\A[^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı — ¿ „ ” * @]+\z
可以构建正则表达式以匹配不正确的字符,例如:
[œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı]
(我没有把所有的角色都包括进去,你明白了!)
如果任何字符匹配,则为失败
或者,如果需要与有效输入匹配的正则表达式,只需在括号前面添加插入符号,如下所示:
[^œçşÇŞ ğĞščřŠŘŇĚŽĎŤČňěž ůŮ İ ť ı]*
您可以为此使用正则表达式,但为什么不使用内置方法检查字符串中是否有任何不允许的字符?例如,在.NET世界中,您可以使用.Contains() 就我个人而言,我会创建一个允许的字符列表,然后检查您的字符串中没有不在列表中的字符。使用白名单将确保您不会忘记任何“坏”字符 一些更多的将被添加到这个列表,但我会有完整的限制列表 最终 我没有完整的允许字符列表(即使 我尝试获取它,并将包括所有字符,如~`!#$%^&([]{};':“,.alongwith 某些外国字符) 您最终将拥有不允许的字符列表,而可能没有允许的字符列表您必须拥有所有允许的字符列表或所有不允许的字符列表。否则无法判断输入是否合法。此外,如果您有一个列表,那么如果字符集已知,则隐式地有第二个列表。然后只实施较短的一个 只是猜测一下,但是如果你使用Unicode,你可能会不允许使用比允许使用更多的字符——想想所有花哨的中国和日本符号。所以我认为你应该建立一个允许字符的列表,并在允许的地方使用像a-z这样的范围 如果您真的想构建不允许的字符列表,那么必须构建一个正则表达式,如[^339;şťťťťťťťťţţţťťţţťťţťţťťţťťţť。如果需要,请不要忘记转义字符,如果可能,请使用范围 在不允许的列表中添加如此多的字符,如[^339;şťťťťťťťťťťť-?“*”+,似乎不起作用
您的列表中有空格。它们也在你的代码中吗?我不确定,但这可能是个问题。最好通过对允许的集合求反来尝试匹配任何不允许的字符。例如,如果您只想允许“a”到“z”,则可以执行以下操作
[^a-z]
您不可能知道所有不允许的字符,但您可能知道允许的字符。因此,构建一个与上面类似的正则表达式,它只匹配一个不在允许集合中的字符。如果找到匹配项,您将知道该字符串包含无效字符
如果可以,尝试使用内置的字符类转义码(如果可用)
找到它们,寻找“角色类和其他特殊转义”。它可以让你有一个像这样的简短的表达
[^\w\d ..other individual chars.. ]
哪种语言?Java/Perl等?我不知道为什么它在ApacheRegexp中会失败,但在Java的内置regex包中,regex编译得很好。内置的正则表达式支持功能强大得多,所以即使你没有这个问题,我也建议你改用它。我不会投你反对票,但这里的正则表达式确实更聪明,因为(a)编译后,它比对照字符列表检查要快,(b)如果将来需求发生变化,它更灵活。
[^\w\d ..other individual chars.. ]