用于验证本地化字符串中的字母和数字的正则表达式

时间:2012-02-29 13:16:24

标签: java regex unicode localization

我有一个本地化的输入字段。我需要使用正则表达式添加验证,它必须只使用字母和数字。如果我只使用英语,我可以使用[a-z0-9]

截至目前,我正在使用方法Character.isLetterOrDigit(name.charAt(i))(是的,我正在遍历每个字符)来过滤掉各种语言中的字母。

有没有更好的方法呢?有没有可用的正则表达式或其他库?

3 个答案:

答案 0 :(得分:20)

从Java 7开始,您可以使用Pattern.UNICODE_CHARACTER_CLASS

String s = "Müller";

Pattern p = Pattern.compile("^\\w+$", Pattern.UNICODE_CHARACTER_CLASS);
Matcher m = p.matcher(s);
if (m.find()) {
    System.out.println(m.group());
} else {
    System.out.println("not found");
}

没有选项,它将无法识别单词“Müller”,而是使用Pattern.UNICODE_CHARACTER_CLASS

  

启用Unicode版本的预定义字符类和POSIX字符类。

请参阅here for more details

您还可以在Java 7中查看here for more Unicode information

并在regular-expression.info上概述了Unicode脚本,属性和块。

See here a famous answer from tchrist关于Java中正则表达式的注意事项,包括使用Java 7更新的内容(将在Java 8中更改)

答案 1 :(得分:8)

boolean foundMatch = name.matches("[\\p{L}\\p{Nd}]*");

应该有用。

[\p{L}\p{Nd}]匹配Unicode字母或数字的字符。正则表达式.matches()方法确保整个字符串与模式匹配。

答案 2 :(得分:1)

  

有些人在遇到问题时会想“我知道,我会用   正则表达式。“现在他们有两个问题。

- Jamie Zawinksi

我在笑话中这样说,但是像你正在做的那样遍历String会使运行时性能至少与任何正则表达式一样好 - 正则表达式无法以更快的速度完成你想做的事情;并且您没有首先编译模式的开销。

所以只要:

  • 验证不需要做任何其他正则表达式(问题中没有提到)
  • 循环通过String的代码的意图是明确的(如果没有,重构直到它)

然后为什么用正则表达式替换它只是因为你可以?