用于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的代码的意图是明确的(如果不是,重构直到它是)
那么为什么用正则表达式替换它只是因为你可以?