0

私はこのような文字列を持っています:

String s = "word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3";

またはこのように:

String s2 = "word3=PS2,p7,p8=q4,q5,q6|=PS3,p9=";

またはこのように:

String s3 = "=PS3=";

したがって、形式的には、文字列には「|」で分割された辞書の単語定義が含まれています。シンボル。

ここ:

  • word - 辞書内の単語 (オプション、S2 や S3 など)

  • PS1、PS2、PS3 - 品詞タグ (必須)

  • p1,p2,... - いくつかのパラメータ (オプション)

  • q1、q2、q3、... - いくつかの別のパラメータ (これもオプション)

テキスト内のそのような文字列のすべての出現を検出し、グループを提供する正規表現を構築したいと思います。

  • group1 - 単語
  • group2 - 品詞タグ
  • group3、group4、... - パラメータ p
  • group(k), group(k+1), ... - 別のパラメータ (q)

最後の p パラメータと最初の q パラメータのグループのインデックスは気にしません。最初のグループ - 単語 (null の可能性あり)、2 番目のグループ - 品詞、およびその他のグループ - パラメータ p および q であることを知っておく必要があります。

今、私はそのような正規表現を持っています:

"([a-z]*)?=([A-Z]+)(,?[a-z]+)*=(,?[a-z]+)*")

しかし、正しく動作しません。最後のパラメータ p と q だけが表示されます。つまり(S2の場合):

  • group1 = word3 - OK
  • group2 = PS2 - OK
  • group3 = p8 - NOT OK (最後の p パラメータのみ)
  • group4 = q6 - NOT OK (最後の q パラメータも)

私たちを手伝ってくれますか?

UPDATE : "="-character p パラメーターと q パラメーターの間の分割文字のみ。私の問題では必要ありません。pパラメータとqパラメータは違うものではないと考えるべきです。

実際の入力の例:

String s = "bread=NOUN,plur,link=form|=VERB="
4

2 に答える 2

2

Regex では可変数のキャプチャ グループを持つことはできません。.Net では、各グループに複数のキャプチャを設定できますが、Java ではできません。問題は、正規表現エンジンが各グループの最後に成功した一致のみを保存することです。あなたができる最善の方法は、すべての p- パラメータと q- パラメータを 2 つの大きなグループに一致させてから、それらを分割することです。

Pattern pattern1 = Pattern.compile(
    "([^|=,]*)" +                // Group 1: The word. Zero or more characters.
    "=([^|=,]*)" +               // Group 2: The part of speech.
    ",?([^|=,]*(?:,[^|=,]*)*)" + // Group 3: The p-params
    "=([^|=,]*(?:,[^|=,]*)*)"    // Group 4: The q-params
);
Matcher matcher = pattern1.matcher("word=PS1,p1,p2,p3=q1,q2|word2=PS3,p4,p5,p6=q3");
while (matcher.find()) {
  String word = matcher.group(1);
  String partOfSpeech = matcher.group(2);
  String pParamString = matcher.group(3);
  String qParamString = matcher.group(4);
  String[] pParams = pParamString.split(",");
  String[] qParams = qParamString.split(",");
  // Do something with the above variables...
}

以前[^|=,]*は、非特殊文字に一致していました。

于 2011-05-02T20:47:33.930 に答える
1

そのような問題があるとき、量指定子の修飾子に注目します。量指定子のいくつかを貪欲に変更したい場合があります。

(,?[az]+)+*

上記のこの違いは、最後の 0 個以上の量指定子が可能な限り取得するようになったことです。これは単なる例であり、その特定の修飾子が必要なものであるかどうかはまったくわかりませんが、報告どおりに式が機能することを考えると、これらの修飾子が残りの方法でそれを取得する可能性が高いようです.

于 2011-05-02T20:42:16.157 に答える