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|$)
(            )((              )(   )   )   )  )(      )

エラー メッセージのパターンには、余分な ')' が 2 つあります。

于 2011-04-12T21:25:18.370 に答える
0
于 2011-04-12T21:42:46.493 に答える