4

次の形式の文字列からキーと値のペアを取得しようとしています。

a0=d235 a1=2314 com1="abcd" com2="a b c d"

この投稿の助けを借りて、キーと値のペアをキャプチャする次の正規表現を作成できました。

Pattern.compile("(\\w*)=(\"[^\"]*\"|[^\\s]*)");

問題は、このパターンの 2 番目のグループも次のように引用符をキャプチャすることです。

a0=d235
a1=2314
com1="abcd"
com2="a b c d"

引用符を除外するにはどうすればよいですか? 私はこのようなものが欲しい:

a0=d235
a1=2314
com1=abcd
com2=a b c d

編集:

引用符があるかどうかに応じて異なるグループで値を取得することにより、上記を実現することができます。私はパーサー用にこのコードを書いているので、パフォーマンス上の理由から、同じグループ番号で値を返すことができる正規表現を考え出そうとしています。

4

2 に答える 2

10

これはどう?アイデアは、最後のグループを2つのグループに分割することです。

Pattern p = Pattern.compile("(\\w+)=\"([^\"]+)\"|([^\\s]+)");

String test = "a0=d235 a1=2314 com1=\"abcd\" com2=\"a b c d\"";
Matcher m = p.matcher(test);

while(m.find()){
    System.out.print(m.group(1));
    System.out.print("=");
    System.out.print(m.group(2) == null ? m.group(3):m.group(2));
    System.out.println();
}

アップデート

更新された質問に答える新しい解決策は次のとおりです。この正規表現は、実際に解析せずに見積もりがあることを確認するために、前向きおよび後読みを適用します。このようにして、上記のグループ2と3を同じグループ(以下のグループ2)に入れることができます。グループ0を返すときに引用符を除外する方法はありません。

Pattern p = Pattern.compile("(\\w+)=\"*((?<=\")[^\"]+(?=\")|([^\\s]+))\"*");

String test = "a0=d235 a1=2314 com1=\"abcd\" com2=\"a b c d\"";
Matcher m = p.matcher(test);

while(m.find()){
    print m.group(1);
    print "="
    println m.group(2);
}

出力

a0=d235
a1=2314
com1=abcd
com2=a b c d
于 2012-07-13T21:34:27.427 に答える
0

正規表現グループに含まれるこの正規表現(\w+)=(("(.+?)")|(.+?)(?=\s|$))キーと値を使用します

于 2012-07-13T21:28:20.080 に答える