1

私が間違っているのは何ですか?変数 param="MOON" を設定すると、333#444 を取得する必要がありますが、333#444:JUPITER=555 を取得しています。したがって、一度に 1 つの値だけが必要です。

final String parameters = "WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666:";
final String param = "MOON";

Pattern pattern = Pattern.compile("(.*)(" + param + ")=(.*)(:+)(.*)");
Matcher matcher = pattern.matcher(parameters);

if(matcher.matches()) {
    System.out.println("3: " + matcher.group(3)); // Value that I needed: 333#444
}

ありがとうございました。

4

4 に答える 4

1

.*貪欲なので、できる限り少なくはありません。

試してみる.*?[^:]*

于 2012-09-26T12:19:11.040 に答える
1

よくわかりませんが、すべての key=value フィールドを抽出したいのではないでしょうか? その場合は、文字列を文字で分割し、:すべての部分を単独で処理する必要があります。次に、これらの文字列部分を正規表現と照合する([^=]+)=(.*)か、より良い方法として、=文字で各部分を単純に分割します。この場合、正規表現を必要とせず、プログラムの実行時間を節約できる可能性があります! MOON= ...を検索することで式を簡単に見つけることができますMOON

編集:私は次の古いJavaスタイルのテストプログラムを実行しました(おそらく改善できます):

class Test
{
        public static void main(String argv[])
        {
                String parameter="WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666";
                String[] elements=parameter.split(":");
                for (int i=0; i < elements.length; i++) {
                        String[] parts=elements[i].split("=", 2);
                        if ((parts.length == 2) && (parts[0].equals("MOON"))) {
                                System.out.println("MOON is "+parts[1]);
                        }
                }
        }
};

出力:

MOON is 333#444

多くの場合、正規表現を使用するのはやり過ぎですが、回避できることが多く、実行時間を節約できます。非常に長い文字列がある場合はMOON、そこから次:の文字列または文字列の末尾を検索してから分割を使用できますが、この場合は正規表現を使用することもできます。他のフィールドも必要かどうかによって異なります。

于 2012-09-26T12:22:01.143 に答える
1

の後にのみいる場合333#444、これは機能します:

MOON=([0-9]+#[0-9]+)

これはあなたを得るでしょうMOON=333#444

(MOON=[0-9]+#[0-9]+)

しかし、明示的に求めているもの、および MOON の値として考えられる値/形式を知らなければ、リストは続く可能性があります ;-)

これ:([A-Z]+?=[0-9]+(#[0-9]+)?)

あなたを得るでしょう:

WORLD=111#222 WORLD=111 #222

MOON=333#444 MOON=333 #444

JUPITER=555

SATURN=666

そしてこれこれ:([A-Z]+?)=([0-9]+(#[0-9]+)?)

あなたを得るでしょう:

WORLD 111#222 #222

MOON 333#444 #444

JUPITER 555

SATURN 666

混ぜる、合わせる、すすぐ、繰り返す;-)

于 2012-09-26T12:26:07.343 に答える
0

パフォーマンスについてはよくわかりませんが、読みやすく、機能しているように見えます。更新2012-09-27:「またはテキストの終わり」を追加... | $

final String parameter5 = "WORLD=111#222:MOON=333#444:JUPITER=555:SATURN=666:";           
final String P = "MOON";

Pattern pattern = Pattern.compile("(.*" + P + "=)(.*?)(:+.*|$)");
Matcher matcher = pattern.matcher(parameter5);

if (matcher.matches()) {
    System.out.println(matcher.group(2)); // 333#444
}
于 2012-09-26T12:46:13.320 に答える