2

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

asd11sdf33sdf55sdfg77sdf

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

我先试过:

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

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

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

我只有11个。如何获得所有?

问候托马斯

4

3 回答 3

2

用作(?!77)(\d\d)aPatternwhile (m.find()) { m.group(1) }wherem是 a Matcher

于 2011-12-19T08:58:58.997 回答
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);
于 2011-12-19T09:05:49.480 回答
0

尝试使用

.*?(11|33|55)

作为您的正则表达式来编译模式,并在 fge 的答案中使用循环。(而且我认为他的回答更加普遍和有意义......

这是因为 .* 或正则表达式中 (11|33|55) 之后的内容匹配 11 之后的整个字符串。(如果你使用贪婪匹配 .* 之前的 (11|33|55) 将匹配之前的整个字符串55...只是因为它很贪心)

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

http://www.regexplanet.com/simple/index.html测试

于 2011-12-19T09:15:35.277 回答