我有一个本地化的输入字段。我需要使用正则表达式添加验证,它必须只使用字母和数字。如果我只使用英语,我可以使用[a-z0-9]
。
截至目前,我正在使用方法Character.isLetterOrDigit(name.charAt(i))
(是的,我正在遍历每个字符)来过滤掉各种语言中的字母。
有没有更好的方法呢?有没有可用的正则表达式或其他库?
答案 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字符类。
您还可以在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)
有些人在遇到问题时会想“我知道,我会用 正则表达式。“现在他们有两个问题。
我在笑话中这样说,但是像你正在做的那样遍历String会使运行时性能至少与任何正则表达式一样好 - 正则表达式无法以更快的速度完成你想做的事情;并且您没有首先编译模式的开销。
所以只要:
然后为什么用正则表达式替换它只是因为你可以?