问题 Java 6正则表达式是一组的多个匹配项


这是简单的模式: [key]: [value1] [value2] [value3] [valueN]

我想得到:

  1.  键
  2.  价值数组

这是我的正则表达式: ^([^:]+):(:? ([^ ]+))++$

这是我的文字: foo: a b c d

Matcher 给了我两组: foo (作为关键)和 d (作为价值观)。

如果我使用 +? 代替 ++ 我明白了 a不是 d

所以java返回第一个(或最后一个)组的出现。

我不能用 find() 因为这里只有  比赛。

除了将正则表达式分成两部分并使用find作为值数组之外,我该怎么办? 我在许多其他环境中使用正则表达式,几乎所有环境都能够获取“第一次出现第1组”,“第二次出现第1组”等等。

我该怎么办? java.util.regex 在JDK6?

谢谢。


7408
2017-08-27 14:09


起源

你能否澄清一下“只有”这一点 一 匹配?“没有办法像你要求的那样捕获不确定数量的匹配,所以这里需要一些迭代。 - seh
它已经是2013年,仍然没有像这个问题的解决方案! 捂脸 - altern


答案:


匹配组的总数不依赖于目标字符串("foo: a b c d",在你的情况下),但在模式上。您的模式将始终包含3个组:

^([^:]+):(:? ([^ ]+))++$
 ^       ^   ^
 |       |   |
 1       2   3

1ST 小组会拿着你的钥匙,2ND group,与第3组匹配,但随后包含一个空格,将始终仅包含1个值。这是第一个值(如果是不合适的话 +?)或最后一个值(在贪婪匹配的情况下)。

你能做的就是匹配:

^([^:]+):\s*(.*)$

这样你就有了以下比赛:

- group(1) = "foo"
- group(2) = "a b c d"

然后拆分2ND 在它的空白区域上获取所有值:

import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {
  public static void main (String[] args) throws Exception {
    Matcher m = Pattern.compile("^([^:]+):\\s*(.*)$").matcher("foo: a b c d");
    if(m.find()) {
      String key = m.group(1);
      String[] values = m.group(2).split("\\s+");
      System.out.printf("key=%s, values=%s", key, Arrays.toString(values));
    }
  }
}

将打印:

key=foo, values=[a, b, c, d]

9
2017-08-27 14:29



一,我认为她的意思 (?: 不 (:?。但更重要的是,这确实被要求了一点。我相信C#有办法做到这一点。扩展API可能很有用,这样人们就可以检索Nᵗʰ组的匹配数组 group_array(N) 或某些;你需要一个新的模式编译标志来启用它,因为它对于一般用途来说太昂贵了。在Perl中可以使用数组 @1 和 @2 而不是标量 $1 和 $2,甚至定义 $1 意思是 $1[$#1] 那是有用的,邪恶的,还是两者兼而有之? :) - tchrist
@tchrist,是的,你可能是正确的 :? < - > ?:。我不是很熟悉C#,从来没有听说过这个N分组功能(你有没有链接到我的MSDN文档?)。它肯定既有用又邪恶! :) - Bart Kiers
是什么让我污染了自己? :) 这表明了这一点 在Capture Collection下和Capture下。不过,我很难读。 :) - tchrist
是否有其他引擎可以捕获所有重复的组匹配?因为如果我在正则表达式结果上进行正则表达式匹配,那将是一种矫枉过正 - Uko
@Uko,我不知道。当然,请随意创建一个新问题。 - Bart Kiers


Scanner s = new Scanner(input).useDelimiter(Pattern.compile(":?\\s+"));
String key = s.next();
ArrayList values = new ArrayList();
while (s.hasNext()) {
    values.add(s.next());
}
System.out.printf("key=%s, values=%s", key, values);

它打印:

key=foo, values=[a, b, c, d]

2
2017-10-17 20:16