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

标签 java regex jakarta-ee

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

在我的程序中,我有一个正则表达式,它确保输入字符串至少有一个字母和一个数字字符,并且长度在 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/

相关文章:

javascript - 将 2 个正则表达式合并为一个

Java拦截器优先级

java - 如何并行使用多个消息并检测所有执行何时完成?

java - 自定义 ListView 适配器空对象引用

java - 无法转换为 java.base/java.util.Optional

java - 从 JAX-WS 生成的代码访问 Web 服务时如何指定主机和端口?

ruby - 使用正则表达式从 Ruby 中的字符串中提取子字符串

ruby-on-rails - 两个字符串数组之间的正则表达式匹配

java - 如何使用带 Struts 2 的 Hibernate 按任何列值删除记录

java - 状态更新不起作用