2

編集:これに対する私の動機を説明するために、ログファイルとパターン(各ログエントリがどのように見えるかを示す非正規表現文字列)を取得し、パターンを正規表現に変換して一致させるコマンドラインユーティリティを作成しています正規表現を含むファイルの各行は、ログイベントのコレクションを生成し、ログイベントは別の形式(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正規表現は何ですか?

4

3 に答える 3

1

"\\w+=\\w+"get result:( "a = 1" "b = foo" "c = bar")を使用し、。で分割します=

于 2012-06-21T04:44:42.337 に答える
1

正しい正規表現は、達成しようとしていることによって異なります。後者の場合、結果は正規表現に関して正しいです。これは、フレーズ<DEBUG>が正規表現の一部であり、末尾: .*もその一部であるため、両方が一致し、文字列の適切なフラグメントが1つだけ存在するためです。

私は個人的に別の解決策を探します-正規表現を直接使用する代わりに、を使用しますsplit。たとえば、関心のある部分が常にとの間>にあり: substringその部分にそのような文字がない場合は、、、indexOfおよびと簡単にうまくいくことができますsplit。分割は2回実行できます(1つは,すべてのkey=valueペアを取得し、次に=各ペアを取得します)。しかし、それは私の解決策にすぎず、最適な解決策ではないかもしれません。

于 2012-06-21T04:50:52.257 に答える
1

正規表現:

\d{2}/\d{2}/\d{4}\s<DEBUG>\s([^=]+)=([^,\s]+)[,\s]([^=]+)=([^,\s]+)[,\s]([^=]+)=([^\s]+)\s:.*

編集:カウントが任意の数になる可能性がある場合は、以下を試してください。

    Scanner s = new Scanner("07/04/2012 <DEBUG> a=1, b=foo, c=bar : d=erere  m=abcd hello world!");
    Pattern p = Pattern.compile("(?<=\\s|,)[^\\s=]+=[^,\\s]+");
    String out;
    while((out = s.findInLine(p))!=null) {
        System.out.println(Arrays.toString(out.split("=")));
    }

出力:

[a, 1]
[b, foo]
[c, bar]
[d, erere]
[m, abcd]
于 2012-06-21T05:42:36.303 に答える