Java 正则表达式组

问题描述 投票:0回答:3

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

asd11sdf33sdf55sdfg77sdf

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

我先尝试过:

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

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

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

我只有11个。如何获得全部?

问候托马斯

java regex regex-greedy
3个回答
2
投票

使用

(?!77)(\d\d)
作为
Pattern
while (m.find()) { m.group(1) }
,其中
m
Matcher


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);

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

进行测试
© www.soinside.com 2019 - 2024. All rights reserved.