Java正则表达式:针对非英语字符进行不区分大小写的匹配

3

我正在尝试使用Java中的PatternMatcher类对俄语进行不区分大小写的匹配。以下是文本:

"some text газированных напитков some other text"

以下是我用来匹配文本的模式:
Pattern pattern = Pattern.compile("(?iu)\\b(" + Pattern.quote("напитки") + ")\\b", Pattern.UNICODE_CHARACTER_CLASS);

我期望以下代码返回true,因为它是一个不区分大小写的比较 (напитки vs напитков):
System.out.println(pattern.matcher("some text газированных напитков some other text").find());

但它总是返回 false。我已经尝试使用其他的 Pattern 常量(如 CASE_INSENSITIVEUNICODE_CASECANON_EQ),但它仍然返回 false

在Java中有没有办法进行这样的比较?这是否有可能呢?


\\b at end might be cause of false since there is a character after напитки. Since your regex is \bнапитки\b there is no match for part of напитков - Rahul
2
等一下,你的文本中没有包含“напитки”(俄语中的“饮料”,复数,主格)。“напитков”是同一个单词,但是它是复数,属格。你的意思是想匹配任何与主格名词相匹配的语法格吗? - Wiktor Stribiżew
@DarshanMehta:你没看到不同的结尾吗?и != ов - Wiktor Stribiżew
2
不,使用正则表达式是不可能的,而且你对西里尔字母的大小写敏感性也是错误的。你应该使用一些 NLP 包来规范化句子中的单词,然后在那里搜索主格中的单词。 - Wiktor Stribiżew
从俄语(我的母语)来看,大小写不敏感意味着可以使用大写或小写字母。@DarshanMehta,“имя существительное” 不同的结尾意味着在英语中有不同的“падеж”或语法格。 - Vitaliy
显示剩余4条评论
2个回答

11

只需在您的 Pattern 中添加此选项:

Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE

对于我的所有西里尔语案例,这种方法都非常有效,并且我使用得非常广泛。


0

这样会正常工作:

Pattern pattern = Pattern.compile("(?iu)\\b(" + Pattern.quote("напитк") + ")\\b");
System.out.println(pattern.matcher("some text газированных \"напитк\"ов some other text").find());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接