有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

包含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);

谢谢你的帮助!:)


共 (2) 个答案

  1. # 1 楼答案

    从给出的错误消息(看起来与所示的字符串regex完全不一样)中,我推断原始模式基本上如下所示,我已冒昧地重新格式化,添加符号常量,并以行号开头,以便我们可以更容易地检查和解决它

    (所有非平凡的模式都应该始终(?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在面对像这里这样的单词字符时,当然应该做的事情,如果你远离非单词粒子,它甚至可能会这样做

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

  2. # 2 楼答案

    正则表达式中的Unicode字符是tricky business

    以下是^{文件中的一段:

    Unicode support

    This class follows Unicode Technical Report #18: Unicode Regular Expression Guidelines, implementing its second level of support though with a slightly different concrete syntax.

    Unicode escape sequences such as \u2014 in Java source code are processed as described in ?3.3 of the Java Language Specification. Such escape sequences are also implemented directly by the regular-expression parser so that Unicode escapes can be used in expressions that are read from files or from the keyboard. Thus the strings "\u2014" and "\\u2014", while not equal, compile into the same pattern, which matches the character with hexadecimal value 0x2014.

    因此,既然我们知道:

    • =\u3049
    • =\u30B9
    • =\u30D1

    写下你想要的图案的正确方法是:

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

    进一步阅读