正则表达式:重复多次重复标记之间的子串

时间:2015-07-15 19:40:35

标签: java regex parsing split substring

我有以下格式的数据:

CODE FIRSTTYPE: [DATA OF FIRST TYPE] SECONDTYPE: [DATA OF SECOND TYPE]

我想把它拆分成这样:

CODE
FIRSTYPE:
DATA OF FIST TYPE 
SECONDTYPE: 
DATA OF SECOND TYPE

任何人都可以帮我这么做吗?

提前致谢!

编辑:

我试过这个:

(\[\s*(((?!\[|\]).)+)\s*\])

但它似乎只做了一次,也删掉了其他的话。

2 个答案:

答案 0 :(得分:0)

这是一个可能的解决方案,它基于将方括号或非空白序列之间的文本匹配到捕获组中:

String str = "CODE FIRSTTYPE: [DATA OF FIRST TYPE] SECONDTYPE: [DATA OF SECOND TYPE]";
Pattern r = Pattern.compile("\\[([^\\]]*)\\]|(\\S+)");
Matcher matcher = r.matcher(str);
List<String> arr = new ArrayList<String>();
while (matcher.find()) {
    if (matcher.group(1) == null)
       arr.add(matcher.group(2));
    else
        arr.add(matcher.group(1));
}
// PRINT FOR DEMO
String[] simpleArray = new String[arr.size()];
arr.toArray(simpleArray);
for (String s : simpleArray) { System.out.println(s); }

这是IDEONE demo

正则表达式是

\[([^\]]*)\]|(\S+)

请参阅regex demo

答案 1 :(得分:0)

如果格式保持不变,则此方法有效:

String name="CODE FIRSTTYPE: [DATA OF FIRST TYPE] SECONDTYPE: [DATA OF SECOND TYPE]";
Pattern pat=Pattern.compile("(\\w+)\\s(\\w+:)\\s\\[([\\w+\\s]*)\\]\\s(\\w+:)\\s\\[([\\w+\\s]*)\\]");
Matcher mat=pat.matcher(name);
while(mat.find()){
    System.out.println(mat.group(1));
    System.out.println(mat.group(2));
    System.out.println(mat.group(3));
    System.out.println(mat.group(4));
    System.out.println(mat.group(5));
}