いくつかの選択肢を抽出するための式が必要です。入力は次のとおりです。
asd11sdf33sdf55sdfg77sdf
11 33と55が必要ですが、77は必要ありません。
私は最初に試しました:
.*(((11)|(33)|(55)).*)+.*
だから私は55しか得られませんでした。しかし怠惰な(貪欲ではない)
.*?(((11)|(33)|(55)).*)+.*
たった11個しか手に入らなかった。全部手に入れるには?
トーマスよろしく
いくつかの選択肢を抽出するための式が必要です。入力は次のとおりです。
asd11sdf33sdf55sdfg77sdf
11 33と55が必要ですが、77は必要ありません。
私は最初に試しました:
.*(((11)|(33)|(55)).*)+.*
だから私は55しか得られませんでした。しかし怠惰な(貪欲ではない)
.*?(((11)|(33)|(55)).*)+.*
たった11個しか手に入らなかった。全部手に入れるには?
トーマスよろしく
として使用(?!77)(\d\d)
しPattern
、while (m.find()) { m.group(1) }
はm
ですMatcher
。
グループは固定されており、グループで "+" を使用して一致のリストを取得することはできません。ループでこれを行う必要があります:
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);
使ってみてください
.*?(11|33|55)
パターンをコンパイルする正規表現として、fge の回答でループを使用します。(そして、彼の答えはより普遍的で意味のあるものだと思います...
これは、正規表現の (11|33|55) の後の .* または何かが 11 の後の文字列全体と一致するためです (そして、貪欲な一致を使用する場合、(11|33|55) の前の .* は前の文字列全体と一致します) 55…欲張りなので)
このようにして、match(1) が 11 である一致を取得し、find() は 11 の後の文字列の一致です。