包含unicode单词的java正则表达式
我想匹配包含某个单词的所有字符串。比如:
String regex = (?:\P{L}|\W|^)(ベスパ)(?:\b|$)
但是,Pattern类不会编译它:
java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 39
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)
我已经将unicode_case设置为编译param,不确定这里出了什么问题
final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE| Pattern.CANON_EQ);
谢谢你的帮助!:)
# 1 楼答案
从给出的错误消息(看起来与所示的字符串regex完全不一样)中,我推断原始模式基本上如下所示,我已冒昧地重新格式化,添加符号常量,并以行号开头,以便我们可以更容易地检查和解决它
(所有非平凡的模式都应该始终以
(?x)
模式编写——即使Java在这里与您对抗,您仍然应该这样做。)第一行和最后一行是错误的,但它们在语义上是错误的,与Java的坏正则表达式有关。它们在语法上并没有错
现在应该很明显,句法问题是第13行和第15行的右括号是假的:它们没有相应的开括号
尽管有第一行和最后一行,我仍在努力理解你们在这里真正想要做的事情。为什么要重复第3行和第4行?那没有任何用处。我看不出在第7行进行分组的理由
目的是允许合并标记适用于上述任何事项吗
至于第一行和最后一行中的错误,我是否明白,您只需要一个简单的单词边界?你是真的想把这些边界字符作为比赛的一部分,还是你只是想建立边界?你为什么说一个非字母或非单词
单词字符确实包括字母,你知道——至少,根据Unicode规范,即使Java确实弄错了。唉,由于Java正则表达式的缺陷,您刚刚包含了一堆字母,所以一旦我了解您真正想要的是什么,我们就必须重新编码
如果你使用的东西实际上符合UTS#18,它就可以正常工作,但我想你还没有(我没有听说ICU),我们必须按照我的思路来解决它
对非单词或字符串开头的查找适用于第一个单词,对非单词或字符串结尾的查找适用于最后一个单词。这就是
\b
在面对像这里这样的单词字符时,当然应该做的事情,如果你远离非单词粒子,它甚至可能会这样做但在我能看到更多的原意之前,我不认为我应该多说
# 2 楼答案
正则表达式中的Unicode字符是tricky business
以下是^{文件中的一段:
因此,既然我们知道:
ベ
=\u3049
ス
=\u30B9
パ
=\u30D1
写下你想要的图案的正确方法是:
进一步阅读: