4

次の形式で編成されたデータを処理しているとします。

[123]="some string" [234]=999999999 [345]="some other string"

Javaでは、KVの組み合わせでそれぞれを分割する最も簡単な方法は何でしょうか。ここで、Kはタグ(で囲まれてい[ ]ます)です。

過去と間のデータを手動でカウントして読み取る代わりに、上記のように構造を定義して反復処理を支援できるUtils(Apacheまたはその他?)メソッドはあります [ ]か?

私たちは何を知っていますか?

  • 各要素にはタグがあります
  • 各タグはで囲まれます[ ]
  • タグとタグに割り当てられた値は、で区切られます=
  • 価値はそこにあります。空の値は許可されていません。
  • 値は引用符で囲まれている場合とされていない場合があります
4

4 に答える 4

4

Pattern正規表現を使用し"\\[(.*?)\\]=(.*?)( (?=\\[)|$)"て、一度にペアを取得します。
唯一の制限は、次の用語がスペースで始まり、その後にが続くと想定される[ため、この文字シーケンスが値内に表示されない場合があることです。

このコードは次のことを示しています。

public static void main(String[] args) {
    String input = "[123]=\"some string\" [234]=999999999 [345]=\"some other string\"";
    Pattern pattern = Pattern.compile("\\[(.*?)\\]=(.*?)( (?=\\[)|$)");
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        String k = matcher.group(1);
        String v = matcher.group(2);
        System.out.println(k + "-->" + v);
    }
}

出力:

123-->"some string"
234-->999999999
345-->"some other string"
于 2012-05-13T15:06:35.550 に答える
1

の仕事のように聞こえjava.util.Scannerます。

于 2012-05-13T14:57:05.993 に答える
1

java.util.Propertiesデータの読み取りに使用できます。結局のところ、それらは単なるkey=valueペアです。

例えば:

String input="[123]=\"some string\" [234]=999999999 [345]=\"some other string\"";
input = input.replaceAll("\\s+\\[", System.getProperty("line.separator") + "[");

Reader in = new StringReader(input);
Properties props = new Properties();
props.load(in);
in.close();

データを抽出するには、次を使用します。

private static String getValue(String key, Properties props) {
    return props.getProperty("[" + key + "]");
}

結果は期待どおりです。

System.out.println(getValue("123", props));
> "some string"

System.out.println(getValue("234", props));
> 999999999

System.out.println(getValue("345", props));
> "some other string"
于 2012-05-13T14:58:47.363 に答える
0

string.split( "")を使用してすべてのキーと値のペアを取得し、string.replaceFirst()を使用して各アイテム内を2回解析します(1回はキーを取得し、もう1回は値を取得します)。

これが最も効率的な方法ではないと思いますが、タイピングに関しては簡単です。

于 2012-05-13T14:58:37.833 に答える