7

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

String regex = (?:\P{L}|\W|^)(ベスパ)(?:\b|$)

但是,Pattern 类不会编译它:

java.util.regex.PatternSyntaxException: Unmatched closing ')' near index 39
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)

我已经设置了 unicode_case 来编译参数,不知道这里出了什么问题

final Pattern pattern = Pattern.compile(regex, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE| Pattern.CANON_EQ);

感谢帮助!:)

4

4 回答 4

1

从给出的错误消息来看,它看起来一点也不像所示的字符串正则表达式,我推断原始模式基本上如下,我冒昧地重新格式化,添加符号常量,并在前面加上我们可能的行号检查和解决它更容易。

(所有重要的模式都应该始终(?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当然是你在面对单词字符时应该做的事情,如果你远离你的非单词粒子,它甚至可能会以这种方式工作。

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

于 2011-04-13T00:40:33.427 回答
0
(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)
(            )((              )(   )   )   )  )(      )

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

于 2011-04-12T21:25:18.370 回答
0
于 2011-04-12T21:42:46.493 回答
0

UNICODE_CHARACTER_CLASS也可以通过嵌入式标志表达式 (?U) 启用该模式

尝试:

(?U)(?:\P{L}|\W|^)((?:ベス|ベス|ヘズ)(?:パ)|パ)|ハ)゚)(?:\b|$)

但是先修好你的括号,因为我不知道你想在中间组中输入或输出什么

于 2015-06-02T08:56:16.323 回答