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|$)";
进一步阅读:
(?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|$)