2

いくつかの選択肢を抽出するための式が必要です。入力は次のとおりです。

asd11sdf33sdf55sdfg77sdf

11 33と55が必要ですが、77は必要ありません。

私は最初に試しました:

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

だから私は55しか得られませんでした。しかし怠惰な(貪欲ではない)

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

たった11個しか手に入らなかった。全部手に入れるには?

トーマスよろしく

4

3 に答える 3

2

として使用(?!77)(\d\d)Patternwhile (m.find()) { m.group(1) }mです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 に答える