4

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

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

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

如何做到这一点?

4

3 回答 3

6

您需要在积极的前瞻中获得捕获组的帮助:

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

印刷

12
23
34
于 2013-01-15T10:21:00.360 回答
1

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

如果您想查找任意正则表达式的重叠匹配而不需要使用前瞻和捕获组,您可以通过在每次匹配后重置匹配器的“区域”来做到这一点

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());
  }
}
于 2013-01-15T10:29:22.817 回答
0

像这样的东西

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

在这里测试和实验

于 2013-01-15T10:23:26.413 回答