【问题标题】:How to support internationalization for String validation?如何支持字符串验证的国际化?
【发布时间】:2012-05-13 14:44:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: java regex jakarta-ee


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回复。我再次检查了要求。它只是一个字符串输入。实际需要的长度是 8-20 字符长。
    【解决方案2】:

    你需要的是 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 启用预定义字符类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])) 将检查第二个字符是否为字母和数字,在所有方面都失败了,我的带有量词的版本检查它们是否在字符串中的任何位置。

    【讨论】:

    • 非常感谢!! Pattern.UNICODE_CHARACTER_CLASS) 不起作用。得到编译错误。所以,我使用了 \p 。我之前也阅读过文档,但没有全部理解。您的其他链接也非常有帮助。再次感谢!!
    • @arsa 不客气,Pattern.UNICODE_CHARACTER_CLASS 是在 Java 7 中引入的,所以它很新。
    • @arsa,因为你是新手(顺便说一句。欢迎来到 SO!),你可能想阅读How does accepting an answer work?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-11
    • 2011-06-22
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多