捕获重复组

时间:2015-04-16 12:59:00

标签: java regex repeat regex-group

首先,让我告诉你我是REGEX的新手,而且我的英语不是更好......

我正在尝试捕获重复组,就像来自http协议的可选标头一样。

我需要的是一个字符串获取所有标题(无或多个):

GET /RESOURCE/RES1 H1:value H2:value H3:value

所以我尝试过的是:

GET /RESOURCE/([^/\s]*)(\s[a-zA-Z:/|-]*)+

但我得到的只是:

Group 1 = LS
Group 2 = H3:value

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您可以使用\G锚点执行类似操作,但无法单独捕获重复的模式。

(?:\G(?!\A)|GET /RESOURCE/)(\S+)(?: |$)

示例:

String s  = "GET /RESOURCE/RES1 H1:value H2:value H3:value";
Pattern p = Pattern.compile("(?:\\G(?!\\A)|GET /RESOURCE/)(\\S+)(?: |$)");
Matcher m = p.matcher(s);
while (m.find()) {
  System.out.println(m.group(1));
}

输出

RES1
H1:value
H2:value
H3:value

答案 1 :(得分:0)

您可以添加包含最后一个捕获组和量词+的另一个捕获组。实际上,您可以将当前捕获组设置为非捕获:

GET /RESOURCE/([^/\s]*)((?:\s[a-zA-Z:/|-]*)+)

现在,捕获组2将为您提供以下结果:

H1:value H2:value H3:value

您可以通过拆分空格,然后冒号来获取单个标题。