如何支持字符串验证的国际化?
在我的程序中,我有一个正则表达式,它确保输入字符串至少有一个字母和一个数字字符,并且长度在 2 到 10 之间。
Pattern p = Pattern.compile("^(?=.\d)(?=.[A-Za-z])[A-Za-z0-9]{2,10}$");
根据新要求,它需要支持国际化。怎么做到的?
为了支持消息的国际化,我使用了资源包和使用翻译硬编码文本的属性文件。但不确定是否实现了验证字符串。
最佳答案
您需要的是 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}
是除表意文字之外的任何文字中的数字零到九
有关 Unicode 属性的更多详细信息,请参阅 regular-expressions.info
Pattern.UNICODE_CHARACTER_CLASS
还有一个新属性 Pattern.UNICODE_CHARACTER_CLASS
启用预定义字符类的 Unicode 版本 see my answer here for some more details and links
你可以这样做
Pattern p = Pattern.compile("^(?=.*\\d)(?=.*[A-Za-z])\\w{2,10}$", Pattern.UNICODE_CHARACTER_CLASS);
和 \w
将匹配来自任何语言的所有字母和所有数字(当然还有一些单词组合字符,如 _
)。
正则表达式错误
我还稍微更改了您的正则表达式。你原来的前瞻 ((?=.\d)(?=.[A-Za-z])
) 会检查第二个字符是一个字母还是一个数字,所有方面都失败了,我的带有量词的版本检查它们是否在字符串中的任何位置。
关于java - 如何支持字符串验证的国际化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10442323/