2016-04-29 131 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 
    
    } 
    

    在上面的類,nameabcmetrics地圖應該有Load爲關鍵和79008作爲值,並同其他鍵:值對。我想使用正則表達式,但不知道我是否可以在這裏使用正則表達式。

    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,那麼你有一個「header」行,否則你有一個key:value對,所以'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