Java 包含unicode字的正则表达式

Java 包含unicode字的正则表达式,java,regex,unicode,character-properties,Java,Regex,Unicode,Character Properties,我想匹配包含某个单词的所有字符串。比如: String regex = (?:\P{L}|\W|^)(ベスパ)(?:\b|$) 但是,模式类不会编译它: java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 39 (?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$) 我已经将unicode_case设置为编译param,不确定这里出了什么问题 final P

我想匹配包含某个单词的所有字符串。比如:

String regex = (?:\P{L}|\W|^)(ベスパ)(?:\b|$)
但是,模式类不会编译它:

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);
谢谢你的帮助!:)


错误消息中的模式有两个额外的“')”

正则表达式中的Unicode字符是一个错误

以下是
模式
文档中的一段:

Unicode支持

这个类遵循Unicode技术报告#18:Unicode正则表达式指南,实现了第二级支持,不过具体语法略有不同

Java源代码中的Unicode转义序列(如
\u2014
)按照Java语言规范的?3.3中所述进行处理。这样的转义序列也由正则表达式解析器直接实现,因此Unicode转义可以用于从文件或键盘读取的表达式中因此,字符串
“\u2014”
“\\u2014”
虽然不相等,但编译成相同的模式
,该模式与十六进制值0x2014的字符相匹配

因此,既然我们知道:

  • =
    \u3049
  • =
    \u30B9
  • =
    \u30D1
编写您所追求的模式的正确方法是:

String regex = "(?:\\P{L}|\\W|^)(\\u30d9\\u30B9\\u30D1)(?:\\b|$)";
进一步阅读


从给出的错误消息(与所示的字符串regex完全不同)中,我推断原始模式基本上如下所示,我已冒昧地对其进行了重新格式化,添加了符号常量,并以行号作为序,以便我们更容易地检查和处理

(所有非平凡的模式都应该始终以
(?x)
模式编写-即使Java在这里与您作对,您仍然应该这样做。)

第一行和最后一行是错误的,但它们在语义上是错误的,与Java的坏正则表达式有关。它们在语法上并没有错

现在应该很明显,句法上的问题是第13行和第15行的右括号是假的:它们没有相应的开括号

尽管有第一行和最后一行,我仍在试图理解你们在这里真正想要做的是什么。为什么要重复第3行和第4行?那没有任何用处。我看不出在第7行进行分组的理由

目的是允许合并标记适用于上述任何事项吗

至于第一行和最后一行中的错误,我是否理解,您只需要一个简单的单词边界?你真的想把这些边界字符作为比赛的一部分,还是你只是想建立边界?你为什么说一个非字母或非单词

你知道,单词字符确实包括字母——至少,根据Unicode规范,即使Java确实弄错了。唉,由于Java正则表达式错误,您刚刚包含了一堆字母,所以一旦我了解您真正想要的是什么,我们就必须重新编码

如果你使用的东西实际上符合UTS#18,它就可以正常工作,但我想你没有(我没有听说ICU),我们必须按照我的思路来修复它

对非单词或字符串开头的查找适用于第一个单词,对非单词或字符串结尾的查找适用于最后一个单词。这就是当你面对这里的单词字符时,
\b
当然应该做的事情,如果你远离你的非单词粒子,它甚至可以这样做


但是,在我能看到更多的原始意图之前,我不认为我应该说得更多。

还可以通过嵌入的标志表达式(?U)启用
UNICODE\U CHARACTER\U类
模式

尝试:


但请先修复括号,因为我不知道中间组的输入或输出。“错误消息中的模式确实包含两个额外的内容”-是错误消息还是您的帖子错误?您不能使用<代码> \W,<代码> \W,<代码> \<代码>,<代码> \d>代码> <代码> \b>代码> <代码> \pAlph} < /代码>也没有Java正则表达式中的任何其他字符类快捷方式,因为Java正则表达式库不符合。如果您不关心所附的字母数字,您可以使用

[\pL\pM\p{Nd}\p{Nl}\p{Pc}]
\w
模拟
[^\pL\pM\p{Nd}\p{Nl}\p{Pc}]
。或者,您可以使用符合Unicode标准的正则表达式库或语言。这意味着调用ICU regex库,或者调用Perl库,等等。您是否使用
java编码UTF-8
进行编译?是的,但他为什么会收到错误消息?他的原始表达式中没有不匹配的括号。嗯,没有。那
\W
会毁了你的一天。@aioobe:问得好。我们不知道,因为他没有发布初始化其
String regex
变量的确切Java代码(ベスパ)(?:\\b |$)”;
@aioobe:也许他没有发布正确的代码,而是复制粘贴了错误。不,我很抱歉,但那个文档是假的。相信我,它是真的。Java甚至不符合一级标准,更不用说它声称的二级标准了。我一直与JDK7人合作,他们现在明白它的谎言有多严重。你不能使用那些东西。诚实的。A所有的RL1.2a都在Java中崩溃了;它只提供了RL1.2所需的11个属性中的3个;它甚至不能正确地执行RL1.1。它有很多严重的问题。它甚至没有接近提供1级支持。哈哈,你难道没有更好的事要做,而不是坐在那里等待一个regexp问题弹出哪一个
String regex = "(?:\\P{L}|\\W|^)(\\u30d9\\u30B9\\u30D1)(?:\\b|$)";
  1     (?: \P{L} | \W | ^ )
  2     (
  3         (?: \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU}
  4           | \N{KATAKANA LETTER BE} \N{KATAKANA LETTER SU}
  5           | \N{KATAKANA LETTER HE} \N{KATAKANA LETTER ZU}
  6         )
  7         (?: \N{KATAKANA LETTER PA} )
  8     |
  9             \N{KATAKANA LETTER PA}
 10     )
 11 |
 12             \N{KATAKANA LETTER HA}
 13     )
 14     \N{COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK}
 15     )
 16     (?: \b | $ )
(?U)(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)