2014-07-11 45 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]}