Java Regex Groups

时间:2011-12-19 08:55:39

标签: java regex find matcher regex-greedy

我需要一个表达式来提取一些替代方案。输入是:

asd11sdf33sdf55sdfg77sdf

我需要11 33和55而不是77。

我先试了一下:

.*(((11)|(33)|(55)).*)+.*

所以我只有55岁。但是懒惰(非贪婪)

.*?(((11)|(33)|(55)).*)+.*

我只有11.如何获得所有?

托马斯

3 个答案:

答案 0 :(得分:2)

(?!77)(\d\d)用作Patternwhile (m.find()) { m.group(1) } mMatcher

答案 1 :(得分:1)

群组已修复,您无法在群组中使用“+”来获取匹配列表。你必须用循环来做到这一点:

    Pattern p = Pattern.compile("((11)|(33)|(55))");
    Matcher m = p.matcher("asd11sdf33sdf55sdfg77sdf");
    int start = 0;
    List<String> matches = new ArrayList<String>();
    while (m.find()) {
        matches.add(m.group());
    }
    System.err.println("matches = " + matches);

答案 2 :(得分:0)

尝试使用

.*?(11|33|55)

作为编译模式的正则表达式,并在fge的答案中使用循环。 (我认为他的答案更具普遍性和意义......

这是因为你的正则表达式中的。*或之后的东西(11 | 33 | 55)与11之后的整个字符串相匹配。(如果使用贪婪匹配,则。*之前(11 | 33 | 55)将匹配55之前的整个字符串......仅仅因为它是贪婪的)

这样你就会得到一个匹配(1)为11的匹配,find()是11之后的字符串匹配。

使用http://www.regexplanet.com/simple/index.html

进行测试