2014-07-11 82 views
0

我已經搜索堆棧溢出和網絡,我發現了類似的問題,但沒有給我一個具體的答案。我有一個字符串,充當一個列表,其格式如下: Key(Value)/ Key(value)/ Key(value,value))。如果密鑰存在,我希望通過密鑰名匹配它們,所以我不想在任何地方包括括號......只是密鑰和值。我編寫出來的東西,但它是一個真正的混亂......正則表達式:列表中的捕獲組像字符串

所以我的條件是: 1)提取鍵值對沒有括號 2)提取它們是否可用... 3)如果列表中值部分包含由「」提取單獨

textToParse =  "TdkRoot(0x0)/Tdk(0x2,0x0)/Tdk(0x0,0x1)/VAL(40A8F0B32240,2x4)/SN(0000:0000:0000:0000:0000:0000:0000:0000/IP(000.1.000.1)/Blue(2x4,2x4)" 

String patternText = "^TdkRoot\(([A-Za-z0-9]) Tdk\((\\w}+) VAL\((\\w) SN\((\\w) IP\  ((\\w) Blue\((\\w)" 

Pattern pattern = Pattern.compile(patternText); 
Matcher matcher = pattern.matcher(textToParse); 

//Extract the groups from the regex (e.g. elements in braces) 
String messageId = matcher.group(1); 
String submitDate = matcher.group(4); 
String statusText = matcher.group(6); 

我認爲一個更清潔/更簡單的方法是提取使用模式爲每個鍵/值的元素分隔兩個值。如果是這樣,我可以用什麼模式來告訴正則表達式:對於「key」來說,抓住「值」但留下圓括號......如果值由彗星分隔..返回數組??可能?

感謝社區!希望能從你那聽到答覆!

PS我知道(?<=\()(.*?)(?=\))會捕獲括號中的任何內容「(此值)被捕獲),但是我怎樣才能修改它以在括號之前指定一個鍵?」我想捕獲這個(圓括號)中的內容「。 ..鍵此 可能由昏迷

+0

提供樣品的輸入和輸出.. – TheLostMind

+0

輸入是textToParse場以上,我使用來測試輸出,沒有得到匹配... – Joe

+0

有是答案..檢查他們是否工作.. – TheLostMind

回答

3
public static void main(String[] args) { 
    String textToParse = "TdkRoot(0x0)/Tdk(0x2,0x0)/Tdk(0x0,0x1)/VAL(40A8F0B32240,2x4)/SN(0000:0000:0000:0000:0000:0000:0000:0000)/IP(000.1.000.1)/Blue(2x4,2x4)"; 
    Pattern p = Pattern.compile("(\\w+)\\((.*?)\\)"); 
    Matcher m = p.matcher(textToParse); 
    while (m.find()) { 
     System.out.println("key :" + m.group(1)); 
     if (m.group(2).contains(",")) { 
      String[] s = m.group(2).split(","); 
      System.out.println("values : " + Arrays.toString(s)); 
     } else { 
      System.out.println("value :" + m.group(2)); 
     } 

    } 
} 

O/P:

key :TdkRoot 
value :0x0 
key :Tdk 
values : [0x2, 0x0] 
key :Tdk 
values : [0x0, 0x1] 
key :VAL 
values : [40A8F0B32240, 2x4] 
key :SN 
value :0000:0000:0000:0000:0000:0000:0000:0000 
key :IP 
value :000.1.000.1 
key :Blue 
values : [2x4, 2x4] 
+0

謝謝!偉大的作品 – Joe

+0

@Joe - 不客氣 – TheLostMind

1

不知道分隔的,如果這是你在找什麼(示例代碼不會編譯),但下面的代碼解析輸入文字到地圖:

String inputText = "TdkRoot(0x0)/Tdk(0x2,0x0)/Tdk(0x0,0x1)/VAL(40A8F0B32240,2x4)/SN(0000:0000:0000:0000:0000:0000:0000:0000)/IP(000.1.000.1)/Blue(2x4,2x4)"; 

Pattern outerPattern = Pattern.compile("([^/()]+)\\(([^()]+)\\)"); 
Pattern innerPattern = Pattern.compile("([^,]+)"); 

Map<String, Collection<String>> parsedData = new HashMap<String, Collection<String>>(); 

Matcher outerMatcher = outerPattern.matcher(inputText); 
while (outerMatcher.find()) { 
    String key = outerMatcher.group(1); 
    String val = outerMatcher.group(2); 

    Collection<String> valueCollection = new ArrayList<String>(); 

    Matcher innerMatcher = innerPattern.matcher(val); 
    while (innerMatcher.find()) { 
    valueCollection.add(innerMatcher.group(1)); 
    } 

    parsedData.put(key, valueCollection); 
} 

System.out.println(parsedData); 

由此產生的地圖(印在最後一行)是

{Blue=[2x4, 2x4], VAL=[40A8F0B32240, 2x4], IP=[000.1.000.1], TdkRoot=[0x0], SN=[0000:0000:0000:0000:0000:0000:0000:0000], Tdk=[0x0, 0x1]}