2016-04-29 19 views
0

私は以下のように応答文字列を持っています。これを解析してクラスを格納する必要があります。書式は以下に示される:特定の形式の文字列を解析する

  • タスク名は、
  • 、その後すぐ下key:value対を固定され、この点線-------------続きます。多くのキー値ペアを持つことができます

以下は応答文字列です。以下は

abc------------- 
Load:79008 
Peak:4932152 

def------------- 
Load:79008 
Peak:4932216 

ghi------------- 
Load:79008 
Peak:4874588 

pqr------------- 
Load:79008 
Peak:4874748 

私のクラスである:上記のクラスで

public class NameMetrics { 

    private String name; 
    private Map<String, String> metrics; 

    // setters and getters 

} 

、他のキーと値と同じようにキーと79008としてLoadを持っている必要がありnameabcmetricsマップする必要があります:valueのペア。私は正規表現を使用することを考えていたが、ここで正規表現を使用できるかどうかはわからない。

private static final Pattern PATTERN = Pattern.compile("(\\S+):\\s*(\\S*)(?:\\b(?!:)|$)"); 

String response = restTemplate.getForObject(url, String.class); 
// here response will have above string. 

これを行うにはどのような方法が最適ですか?

+2

正規表現は必要ありません。入力行を行単位で繰り返し入力してください。 – anubhava

+1

行を読み込みます。空白行をスキップします。 'line.indexOf( ':')'が-1を返すならば、あなたは "ヘッダ"行を持っています。そうでなければ、キーと値のペアを持っていますので、 'substring()'はキーと値です。すすぎ、繰り返します。 – Andreas

答えて

2
BufferedReader reader = new BufferedReader(...???...); 
NameMetrics current = null; 
List<NameMetrics> result = new ArrayList<>(); 
while (true) { 
    String s = reader.readLine(); 
    if (s == null) { 
    break; // end reached 
    } 
    if (s.trim().isEmpty()) { 
    continue; // Skip empty line 
    } 
    int cut = s.indexOf(':'); 
    if (cut == -1) { 
    cut = s.indexOf('-'); 
    if (cut == -1) { 
     continue; 
    } 
    current = new NameMetrics(); 
    current.setName(s.substring(0, cut)); 
    result.add(current); 
    } else if (current != null) { 
    current.setMetrics(s.substring(0, cut), s.substring(cut+1)); 
    } 
} 
+0

その '... ??? ...'を記入するには、 'new StringReader(response)'を使うことができます。 – 4castle

関連する問題