如何支持字符串验证的国际化?
在我的程序中,我有一个正则表达式,它确保输入字符串至少有一个alpha和一个数字字符,长度在2到10之间。
Pattern p = Pattern.compile("^(?=.\d)(?=.[A-Za-z])[A-Za-z0-9]{2,10}$");
根据新要求,它需要支持国际化。怎么办呢?
为了支持消息的国际化,我使用了翻译的硬编码文本的资源包,属性文件。但不确定它是否可以实现验证字符串。
答案 0 :(得分:4)
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
,用于启用预定义字符类see my answer here for some more details and links的Unicode版本
你可以做这样的事情
Pattern p = Pattern.compile("^(?=.*\\d)(?=.*[A-Za-z])\\w{2,10}$", Pattern.UNICODE_CHARACTER_CLASS);
和\w
会匹配任何语言的所有字母和所有数字(当然还有一些单词组合_
等字符。)
正则表达式出错
我也改变了你的正则表达式。您的原始前瞻((?=.\d)(?=.[A-Za-z])
)将检查第二个字符是字母和数字,什么是各方面都失败了,我的量化器版本检查它们是否在字符串中的任何位置。
答案 1 :(得分:0)
此时最好定义哪些字符(如果有的话)不算作字母字符(如空格等?)。然后只需将其设为“至少一个数字和一个非数字字符”。但我认为你对这个要求的问题源于它有点愚蠢。
这是密码吗?双字符密码完全不安全。有些人可能想要使用超过十个字符的密码。实际上是否有任何理由不允许更长的密码?
http://xkcd.com/936/可以很好地概述实际强密码的含义。要求数字对现代攻击者没有多大帮助,但却使用户的生活更加艰难。最好需要长密码。