Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 6正则表达式一个组的多个匹配项_Java_Regex - Fatal编程技术网

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

Java 6正则表达式一个组的多个匹配项,java,regex,Java,Regex,下面是简单的模式:[key]:[value1][value2][value3][valueN] 我想得到: 钥匙 值数组 这是我的正则表达式:^([^:]+):(:?([^]+)++$ 这是我的文字:foo:abcdc Matcher为我提供了两个组:foo(作为键)和d(作为值) 如果我使用+?而不是+我得到的是a,而不是d 所以java返回组的第一次(或最后一次)出现 我不能在这里使用find(),因为这里只有一个匹配项 除了将正则表达式拆分为两部分并对值数组使用find之外,我还能做什么?

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

我想得到:

  • 钥匙
  • 值数组
  • 这是我的正则表达式:
    ^([^:]+):(:?([^]+)++$

    这是我的文字:
    foo:abcdc

    Matcher
    为我提供了两个组:
    foo
    (作为键)和
    d
    (作为值)

    如果我使用
    +?
    而不是
    +
    我得到的是
    a
    ,而不是
    d

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

    我不能在这里使用
    find()
    ,因为这里只有一个匹配项

    除了将正则表达式拆分为两部分并对值数组使用find之外,我还能做什么? 我在许多其他环境中使用过正则表达式,几乎所有的正则表达式都能够获取“组1的第一次出现”、“组1的第二次出现”等等

    如何在JDK6中使用
    java.util.regex


    谢谢。

    匹配组的总数不取决于目标字符串(
    “foo:a b c d”
    ,在您的情况下),而是取决于模式。您的模式将始终有3个组:

    ^([^:]+):(:? ([^ ]+))++$
     ^       ^   ^
     |       |   |
     1       2   3
    
    第一组将保存您的密钥,第二组(与第3组相同,但随后包含一个空格)将始终只保存您的一个值。这是第一个值(在ungreedy
    +?
    的情况下)或最后一个值(在贪婪匹配的情况下)

    您可以做的只是匹配:

    ^([^:]+):\s*(.*)$
    
    这样您就有了以下匹配项:

    - group(1) = "foo"
    - group(2) = "a b c d"
    
    然后在第二组的空白处拆分,以获得所有值:

    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]
    
    它打印:

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

    你能澄清一下关于“只有一个匹配”的观点吗?没有办法像你所问的那样捕获不确定数量的匹配,因此这里需要一些迭代。现在已经是2013年了,这个问题仍然没有像样的解决方案!facepalmOne,我想她指的是
    (?:
    而不是
    (:?
    )。但更重要的是,这确实需要一点。我相信C#有一种方法可以做到这一点。扩展API可能很有用,这样就可以检索N的匹配数组ᵗʰgroup via
    group_array(N)
    或诸如此类;您需要一个新的模式编译标志来启用它,因为它对于一般使用来说太昂贵了。在Perl中,可以使用数组
    @1
    @2
    而不是标量
    $1
    $2
    ,甚至定义
    $1
    的意思是
    $1[$1]
    等等。这是有用的,邪恶的,还是两者兼而有之?:)@tchrist,是的,你可能对
    :?
    ?:
    。我不太熟悉C,也从来没有听说过这种N分组功能(你有链接到MSDN文档吗?)。它肯定既有用又邪恶!:)是什么让我污染了自己?:)在捕获集合和捕获下。不过,我读起来有点困难。:)是否有其他引擎允许捕获所有重复的组匹配?因为如果我在正则表达式上进行正则表达式匹配,那就太过分了results@Uko,我不知道。当然,你可以随意提出一个新问题。
    key=foo, values=[a, b, c, d]