Java匹配器。从一个序列返回多个条目

时间:2013-01-15 10:17:54

标签: java regex

例如,我有以下正则表达式:\d{2}(2位数)。当我使用

  Matcher matcher = Pattern.compile("\\d{2}").matcher("123");
  matcher.find();
  String result = matcher.group();

在结果变量中,我只获得第一个条目,即12。但我希望得到所有可能的条目,即1223

如何实现这一目标?

3 个答案:

答案 0 :(得分:6)

你需要积极前瞻的捕获小组的帮助:

Matcher m = Pattern.compile("(?=(\\d{2}))").matcher("1234");
while (m.find()) System.out.println(m.group(1));

打印

12
23
34

答案 1 :(得分:1)

这不是正则表达式匹配的工作方式。匹配器从字符串的开头开始,每次找到匹配时,它会继续从该匹配的 end 后面的字符中查找 - 它不会给你重叠的匹配。

如果要查找任意正则表达式的重叠匹配而无需使用前瞻和捕获组,可以通过在每次匹配后重置匹配器的“区域”来执行此操作

Matcher matcher = Pattern.compile(theRegex).matcher(str);

// prevent ^ and $ from matching the beginning/end of the region when this is
// smaller than the whole string
matcher.useAnchoringBounds(false);
// allow lookaheads/behinds to look outside the current region
matcher.useTransparentBounds(true);

while(matcher.find()) {
  System.out.println(matcher.group());
  if(matcher.start() < str.length()) {
    // start looking again from the character after the _start_ of the previous
    // match, instead of the character following the _end_ of the match
    matcher.region(matcher.start() + 1, str.length());
  }
}

答案 2 :(得分:0)

像这样的事情

^(?=[1-3]{2}$)(?!.*(.).*\1).*$

测试和实验here