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

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

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

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

从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字符类。

有关详细信息,请参见此处

您还可以在这里查看 Java 7中的更多Unicode信息 。

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

请参阅tchrist关于Java 中正则表达式注意事项的一个着名答案 ,包括Java 7中更新的内容(将在Java 8中更新)

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

应该管用。

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

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

– Jamie Zawinksi

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

所以只要:

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

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