如何捕获一个组到下一个第一个组?

时间:2019-04-12 20:47:33

标签: java regex

有一个字符串:

station:C1,C2,C3,C4,C5,team:C5TQ5,C3TQ1,C5TQ1,test:value,...

当我进入第三组时,我想直到下一个第一组。

我的正则表达式:

/(\w+?)(:)(.*)/g

我希望:

工作站(第1组)
:(组2)
C1,C2,C3,C4,C5(第3组)

团队(第1组)
:(组2)
C5TQ5,C3TQ1,C5TQ1(第3组)

测试(第1组)
:(组2)
值(第3组)

等等。

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

(\w+)(:)(.*?)(?=,\w+:|,?$)

这将进行正向查找,直到找到下一组或到达字符串末尾为止。

结果将是这样:

result

答案 1 :(得分:1)

如果我对您的理解正确,那么您正在寻找像(\w+)(:)(\w+(,(?![^,]+:)\w+)*)这样的正则表达式,其中

  1. (\w+)将“密钥”放在组1中
  2. (:)将冒号置于第2组
  3. ((\w+)(,(?![^,]+:)\w+)*)在第3组中放置一个字母数字单词\w+(可选),后跟零个或多个以逗号分隔的单词。
    • 使用negative look ahead (?![^,]+:),我们可以确保接受的单词(非逗号字符序列)后面不能加冒号。

演示:

String data = "station:C1,C2,C3,C4,C5,team:C5TQ5,C3TQ1,C5TQ1,test:value";

Pattern p = Pattern.compile("(\\w+)(:)(\\w+(,(?![^,]+:)\\w+)*)");
Matcher m = p.matcher(data);
while (m.find()){
    System.out.println(m.group(1));
    System.out.println(m.group(2));
    System.out.println(m.group(3));
    System.out.println("===");
}

输出:

station
:
C1,C2,C3,C4,C5
===
team
:
C5TQ5,C3TQ1,C5TQ1
===
test
:
value
===