正则表达式:在列表中捕获组,如字符串

时间:2014-07-11 13:35:59

标签: java regex

我搜索了堆叠溢出和网络,我发现了类似的问题,但没有一个给我一个具体的答案。我有一个字符串作为列表,具有以下格式 键(值)/键(值)/键(值,值))。我希望通过密钥名称匹配它们,如果密钥存在,所以我真的不希望括号包含在任何地方..只是键和值。我编写了一些东西,但这真是一团糟......

所以我的条件是: 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”获取“value”但是留下括号...如果值由逗号分隔..返回数组??可能?

感谢社区!!希望收到你的来信!

PS我知道(?<=\()(.*?)(?=\))将捕获括号中的任何内容“(此值)已捕获),但如何修改它以在括号前指定一个键?”我想捕获这个中的什么(括号) )“......关键 可能由昏迷划定

2 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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]}