如何支持字符串验证的国际化?
在我的程序中,我有一个正则表达式,它确保输入字符串至少有一个字母和一个数字字符,长度在 2 到 10 之间。
Pattern p = Pattern.compile("^(?=.\d)(?=.[A-Za-z])[A-Za-z0-9]{2,10}$");
根据新要求,它需要支持国际化。怎么做到呢?
为了支持消息的国际化,我使用了资源包,属性文件使用了翻译的硬编码文本。但不确定是否可以验证字符串。
如何支持字符串验证的国际化?
在我的程序中,我有一个正则表达式,它确保输入字符串至少有一个字母和一个数字字符,长度在 2 到 10 之间。
Pattern p = Pattern.compile("^(?=.\d)(?=.[A-Za-z])[A-Za-z0-9]{2,10}$");
根据新要求,它需要支持国际化。怎么做到呢?
为了支持消息的国际化,我使用了资源包,属性文件使用了翻译的硬编码文本。但不确定是否可以验证字符串。
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])
) 将检查第二个字符是否为字母和数字,在所有方面都失败了,我的带有量词的版本检查它们是否在字符串中的任何位置。
此时最好定义哪些字符(如果有)不计为字母字符(如空格等?)。然后将其设为“至少一个数字和一个非数字字符”。但我认为您在要求方面遇到的问题源于它有点愚蠢。
这是要密码吗?两个字符的密码完全不安全。有些人可能希望使用超过十个字符的密码。实际上有什么理由不允许更长的密码吗?
http://xkcd.com/936/很好地概述了真正强密码的构成。要求数字对现代攻击者没有多大帮助,但会使用户的生活更加困难。最好要求一个长密码。