从给出的错误信息,这看起来一点也不像显示的字符串正则表达式,我推断原始模式基本如下,我已经自由地重新格式化,添加符号常量,并以我们可能会检查并更容易处理的行号。
(所有非平凡的模式应该始终写在(?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),我们必须沿着线路修复它我有previously outlined。
无论是单词还是字符串的开头都可以用于第一个字母,而对于非单词或字符串结尾的预读都适用于最后一个单词。这就是\b
当然是假设当面对单词字符的时候你会这样做,而且如果你保持清楚你的非单词的粒子,它甚至可以用这种方法。
但是,直到我能看到更多的原始意图,我不认为我应该多说了。
错误消息*中的模式*包含两个额外的) - 是错误消息还是您的帖子错误? – Erik 2011-04-12 21:22:47
您**不得**使用'\ W','\ w','\ s','\ d','\ b','\ p {alpha}'或任何其他字符类Java正则表达式中的快捷方式,因为Java正则表达式库不符合[Unicode正则表达式的形式要求](http://unicode.org/reports/tr18/#Compatibility_Properties)。你可以用'[\ pL \ pM \ p {Nd} \'\'\'\'\'\'用\ [\ pL \ pM \ p {Nd} \ p {Nl} \ p { p {Nl} \ p {Pc}]'如果你不关心Enclosed_Alphanumerics。或者,您可以使用符合Unicode标准的正则表达式库或语言。这意味着调用ICU正则表达式库,或者调用Perl的等等。 – tchrist 2011-04-12 21:31:32
你用'java -encoding UTF-8'编译了吗? – tchrist 2011-04-12 22:06:44