从给出的错误消息来看,它看起来一点也不像所示的字符串正则表达式,我推断原始模式基本上如下,我冒昧地重新格式化,添加符号常量,并在前面加上我们可能的行号检查和解决它更容易。
(所有重要的模式都应该始终以(?x)
模式编写——即使 Java 在这里与你作斗争,你仍然应该这样做。)
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 | $ )
第一行和最后一行是错误的,但它们在与 Java 损坏的正则表达式相关的语义方面是错误的。它们在语法上没有错误。
现在应该很明显了,语法问题是第 13 行和第 15 行的右括号是虚假的:它们没有相应的左括号。
尽管有第一行和最后一行,我仍然试图理解你在这里真正想要做什么。为什么要重复第 3 行和第 4 行?那没有任何用处。我看不出在第 7 行进行分组的原因。
是否允许组合商标适用于前述任何事物?
至于第一行和最后一行中的错误,我是否理解您正在寻找一个简单的单词边界?您是否真的打算将这些边界字符作为匹配的一部分包含在内,或者您只是想建立边界?你为什么说一个非字母或非单词?
你知道,单词字符确实包含字母——至少,根据它们所做的 Unicode 规范,即使 Java 确实犯了这个错误。唉,尽管由于 Java 正则表达式错误,您刚刚包含了一堆字母,所以一旦我了解您真正想要的内容,我们将不得不重新编码。
如果您只使用了实际上符合 UTS#18 的东西,它会正常工作,但我认为您没有(我没有听说过 ICU),我们将不得不按照我之前概述的路线修复它.
对非单词或字符串开头的后视将适用于第一个,而对非单词或字符串结尾的前瞻将适用于最后一个。这\b
当然是你在面对单词字符时应该做的事情,如果你远离你的非单词粒子,它甚至可能会以这种方式工作。
但在我能看到更多的原意之前,我认为我不应该多说。