【问题标题】:Capturing repeating groups捕获重复组
【发布时间】:2015-04-16 12:58:59
【问题描述】:

首先让我警告你,我是 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

我做错了什么?

【问题讨论】:

  • 您希望结果如何?所有标题都应该分开吗?

标签: java regex repeat regex-group


【解决方案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

【讨论】:

  • 我会看看你的解决方案...但首先我需要再学习一下 REGEX...
【解决方案2】:

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

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

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

H1:value H2:value H3:value

您可以通过按空格分割,然后是冒号来从中获取单独的标题。

【讨论】:

  • 我已经尝试过该解决方案。但是我想知道我是否可以获得可变数量的组。但我会记住这一点。谢谢你。
猜你喜欢
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多