編集:これに対する私の動機を説明するために、ログファイルとパターン(各ログエントリがどのように見えるかを示す非正規表現文字列)を取得し、パターンを正規表現に変換して一致させるコマンドラインユーティリティを作成しています正規表現を含むファイルの各行は、ログイベントのコレクションを生成し、ログイベントは別の形式(JSONなど)で出力されます。入力パターンがどうなるか、ファイルに何が含まれるかを推測することはできません。
キーと値のペアのCSVリストを解析したいと思います。リストから個々のキーと値をキャプチャする必要があります。入力文字列の例:
2012年7月4日<DEBUG> a= 1、b = foo、c = bar:hello world!\ n
以下の正規表現が入力からキーと値を正しく抽出することを確認しました。
// regex
(([^,\s=]+)=([^,\s=]+)(?:,\s*(?:[^,\s=]+)=(?:[^,\s=]+))*?)
// input string
a=1, b=foo, c=bar
結果は次のとおりです。
// 1st call
group(1) == "a"
group(2) == "1"
// 2nd call
group(1) == "b"
group(2) == "foo"
// 3rd call
group(1) == "c"
group(2) == "bar"
ただし、この正規表現(上記の正規表現に「もの」が追加されているものと同じ)は、期待どおりに機能しません。
// regex
\d{2}/\d{2}/\d{4} <DEBUG> (([^,\s=]+)=([^,\s=]+)(?:,\s*(?:[^,\s=]+)=(?:[^,\s=]+))*?) : .*
// input string
07/04/2012 <DEBUG> a=1, b=foo, c=bar : hello world!
何らかの理由で、結果は次のようになります。
group(1) == "a=1, b=foo, c=bar"
group(2) == "a"
group(3) == "1"
// no more matches
キーと値を抽出するための正しいJava正規表現は何ですか?