Java Regexp Groups - PullRequest
       29

Java Regexp Groups

2 голосов
/ 19 декабря 2011

Мне нужно выражение, чтобы извлечь некоторые альтернативы. Ввод:

asd11sdf33sdf55sdfg77sdf

Мне нужны 11 33 и 55, но не 77.

Сначала я попробовал:

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

Итак, я получил только 55. Но с ленивым (не жадным)

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

Я получил только 11. Как получить все?

С уважением, Томас

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011

Используйте (?!77)(\d\d) как Pattern и while (m.find()) { m.group(1) }, где m - это Matcher.

1 голос
/ 19 декабря 2011

Группы фиксированы, вы не можете использовать «+» в группе, чтобы получить список совпадений. Вы должны сделать это с помощью цикла:

    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 голосов
/ 19 декабря 2011

попробуйте использовать

.*?(11|33|55)

в качестве регулярного выражения для компиляции шаблона и использовать цикл в ответе fge.(и я думаю, что его ответ более универсален и значим ...

Это потому, что. * или что-то после (11 | 33 | 55) в вашем регулярном выражении соответствует всей строке после 11. (и если выиспользуйте жадное совпадение. * before (11 | 33 | 55) будет соответствовать всей строке до 55 ... только потому, что оно жадное)

Таким образом, вы получите совпадение, чье совпадение (1) равно 11, find () - совпадение строки после 11.

, проверено с http://www.regexplanet.com/simple/index.html

...