尝试匹配字符串“МанихинаГалинаВладимировна”和其他相同格式的字符串。也就是说,一个有三个单词的专有名称。我是正则表达式的新手,我不确定我的陈述有什么问题。
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));
}
}
}
答案 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
匹配反斜杠,然后是空格,当(我假设)你只想匹配空格。