Java正则表达式不匹配(俄语)

时间:2018-01-25 23:11:51

标签: java regex

尝试匹配字符串“МанихинаГалинаВладимировна”和其他相同格式的字符串。也就是说,一个有三个单词的专有名称。我是正则表达式的新手,我不确定我的陈述有什么问题。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {
    public static void main(String [] args){
        String temp = "Манихина Галина Владимировна";
        Pattern pattern = Pattern.compile("^[а-я]+\\s[а-я]+\\s[а-я]+$", Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(temp);
        if (matcher.find()){
            System.out.println(matcher.group(0));
        }
    }
}

3 个答案:

答案 0 :(得分:7)

根据Java documentation文档,regexp与unicode不匹配:

  

默认情况下,不区分大小写的匹配假定只匹配US-ASCII字符集中的字符

为了使您的代码正常工作,请添加UNICODE_CASE标志:

Pattern pattern = Pattern.compile("^[а-я]+\\s[а-я]+\\s[а-я]+$",
    Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);

答案 1 :(得分:3)

默认情况下,Java在使用字符类时不能正确匹配unicode文本:(代码中为\\s)。您必须使用UNICODE_CHARACTER_CLASS才能使用预定义的类,例如您在模式中使用的空白字符类。 所以工作的Pattern.compile用法是:

Pattern pattern = Pattern.compile("^[а-я]+\\s[а-я]+\\s[а-я]+$",
    Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CHARACTER_CLASS);

当你添加UNICODE_CHARACTER_CLASS时,你也暗示使用UNICODE_CASE标志 - 这是CASE_INSENSITIVE标志使用unicode字符所必需的

答案 2 :(得分:-1)

这种模式应该有效:

^[A-Я][а-я]+\s[A-Я][а-я]+\s[A-Я][а-я]+$

您的模式存在两个问题:

  • 你没有包含字母表中的大写字母;
  • \\s匹配反斜杠,然后是空格,当(我假设)你只想匹配空格。