模式对象与不同语言不匹配

时间:2012-01-03 13:26:36

标签: java regex

我有以下reg表达式,当用户输入英语时工作正常。 但是在使用葡萄牙语字符时总是会失败。

Pattern p = Pattern.compile("^[a-zA-Z]*$");
Matcher matcher = p.matcher(fieldName);

if (!matcher.matches())
{
   ....
}

有没有办法让模式对象识别有效的葡萄牙语字符,例如ÁÂÃÀÇÉÊÍÓÔÕÚç....?

由于

3 个答案:

答案 0 :(得分:5)

它应该与"^\p{IsAlphabetic}*$"一起使用,它考虑了Unicode字符。有关参考,请参阅http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

中的选项

答案 1 :(得分:5)

您需要一个与所有字母字母的类匹配的正则表达式。在世界上所有的脚本中,都有加载,但幸运的是我们可以告诉Java 6的RE引擎我们正在写一封信,它会使用Unicode类的神奇来完成其余的工作。特别是,L类匹配所有类型的字母,上部,下部和“哦,这个概念不适用于我的语言”:

Pattern p = Pattern.compile("^\\p{L}*$");
// the rest is identical, so won't repeat it...

在阅读docs时,请记住,如果放在Java文本中,则需要将反斜杠加倍,以便阻止Java编译器将它们解释为其他内容。 (另请注意,RE不适合验证人名,这是一个完全不同且更加困难的问题。)

答案 2 :(得分:3)

查看Pattern文档,特别是关于Unicode的部分:

  

Unicode块和类别使用\ p和\ P编写   像Perl一样构造。如果输入具有属性,则\ p {prop}匹配   如果输入具有该属性,则\ P {prop}不匹配。   使用前缀In指定块,如InMongolian中所示。分类   可以使用可选前缀Is:Both \ p {L}和\ p {IsL}指定   表示Unicode字母的类别。块和类别可以   在字符类的内部和外部使用。

(适用于Java 1.4.x)。我怀疑你有兴趣识别Unicode字母而不是特别是葡萄牙字母?