1

特定の文字列の正規表現を生成する際に問題が発生しました。

私のソース文字列は、基本的にキーと値のペアのセットです。私の希望する出力は次のとおりです。サンプル文字列は次のとおりです。

:27B:Hello: World!
     Something
     World: Hello
:29A:Test
:30:Something isn't right-}

望ましい出力:

Key: 27B  Value: Hello: World!
     Something
     World: Hello
Key: 29A  Value: Test
Key: 30   Value: Something isn't right

これまでの私の正規表現は次のとおりです。

(\\d+\\w?):([\\w\\d\\s'/,:\\Q.()\\E]+(?=(:\\s*\\d+\\w?:|\\-\\})))

問題は、メッセージ全体をキャプチャしているように見えることです。

   e.g. Key: 27B Value:Hello: World!
         Something
         World: Hello
    :29A:Test
    :30:Something isn't right

これらのキーと値のペアを抽出するには、どのような正規表現を使用すればよいですか?

4

2 に答える 2

3

+貪欲であるため、先読みが一致できる文字列の最後の[\\w\\d\\s'/,:\\Q.()\\E]+ポイントまでのすべての文字をキャプチャします。そのような最初のポイントまでのみを取得するには、代わりに「消極的な」バージョンを使用する必要があります。+?

于 2013-05-02T15:18:38.397 に答える
1

次のようなことを試すことができます:

Pattern p = Pattern.compile(":(\\d+\\w?):((?:[^:-]|:(?!\\d+\\w?:)|-(?!\\}))+)(?:-}[\\S\\s]*)?");
Matcher m = p.matcher(s);
while (m.find())
    System.out.print("Key: " + m.group(1) + " Value: " + m.group(2));

目的の出力を生成します。最後のオプションのグループは、consumed-}とそれ以降のすべてです。基本的にキーを見つけて、別のキーにヒットするまですべての文字を消費します。

編集:
元の正規表現にもっと忠実なものが必要な場合は、次を使用できます。

Pattern p = Pattern.compile("(\\d+\\w?):(.+?(?=(:\\s*\\d+\\w?:|\\-\\})))",Pattern.DOTALL);
于 2013-05-02T14:41:46.247 に答える