4

如何支持字符串验证的国际化?

在我的程序中,我有一个正则表达式,它确保输入字符串至少有一个字母和一个数字字符,长度在 2 到 10 之间。

Pattern p = Pattern.compile("^(?=.\d)(?=.[A-Za-z])[A-Za-z0-9]{2,10}$");

根据新要求,它需要支持国际化。怎么做到呢?

为了支持消息的国际化,我使用了资源包,属性文件使用了翻译的硬编码文本。但不确定是否可以验证字符串。

4

2 回答 2

4

你需要的是Unicode!

Unicode 代码属性

Pattern p = Pattern.compile("^(?=.*\p{Nd})(?=.*\p{L})[\p{L}\p{Nd}]{2,10}$");

\p{L}并且\p{Nd}是 Unicode 属性,其中

\p{L}是来自任何语言的任何类型的字母

\p{Nd}是除表意文字之外的任何文字中的数字 0 到 9

有关 Unicode 属性的更多详细信息,请参阅regular-expressions.info

Pattern.UNICODE_CHARACTER_CLASS

还有一个新属性Pattern.UNICODE_CHARACTER_CLASS可以启用预定义字符类的 Unicode 版本,请在此处查看我的答案以获取更多详细信息和链接

你可以做这样的事情

Pattern p = Pattern.compile("^(?=.*\\d)(?=.*[A-Za-z])\\w{2,10}$", Pattern.UNICODE_CHARACTER_CLASS);

并且\w将匹配来自任何语言的所有字母和所有数字(当然还有一些组合字符的单词,例如_)。

正则表达式错误

我也稍微改变了你的正则表达式。您最初的前瞻 ( (?=.\d)(?=.[A-Za-z])) 将检查第二个字符是否为字母和数字,在所有方面都失败了,我的带有量词的版本检查它们是否在字符串中的任何位置。

于 2012-05-04T06:36:25.413 回答
0

此时最好定义哪些字符(如果有)不计为字母字符(如空格等?)。然后将其设为“至少一个数字和一个非数字字符”。但我认为您在要求方面遇到的问题源于它有点愚蠢。

这是要密码吗?两个字符的密码完全不安全。有些人可能希望使用超过十个字符的密码。实际上有什么理由不允许更长的密码吗?

http://xkcd.com/936/很好地概述了真正强密码的构成。要求数字对现代攻击者没有多大帮助,但会使用户的生活更加困难。最好要求一个长密码。

于 2012-05-04T06:10:47.280 回答