まずあなたが一つに両方の式をマージこのような何かを達成することができます。
(^c\w+)|\s(c\w+)|(\w*me\w*)
あなたはこの正規表現にマッチした場合、すべての試合には、いくつかの単語の文字や「私」を含む単語に続く「C」で始まる単語のいずれかになります。すべてのマッチについて、グループ「 (1)または(2)」は「c」で始まる単語を示し、 (3)は「me」を含む単語を示します。
ただし、あなたは単語の区切り文字、この場合は\ s文字を知っています。
例コード:
String text = "camel crime care cool medium melt home";
final Pattern PATTERN = Pattern.compile("(^c\\w+)|\\s(c\\w+)|(\\w*me\\w*)");
// Save all matches
List<String> wordsStartingWithC = new ArrayList<>();
List<String> wordsIncludingMe = new ArrayList<>();
for (Matcher m = PATTERN.matcher(text); m.find();) {
if(m.group(1) != null) {
wordsStartingWithC.add(m.group(1));
} else if(m.group(2) != null) {
wordsStartingWithC.add(m.group(2));
} else if(m.group(3) != null) {
wordsIncludingMe.add(m.group(3));
}
}
System.out.println(wordsStartingWithC);
System.out.println(wordsIncludingMe);
私は多少異なるアプローチを取ることによって、これを簡素化するためにお勧めします。 単語リミッタ、つまり空白文字を知っているように思われるので、元の文字列を分割するだけですべての単語のコレクションを得ることができます。
String[] words = "camel crime care cool medium melt home".split(" ");
次に、これらのすべてを繰り返し処理します。
for(String word: words) {
if(word.startsWith("c")) {
// put in your list for words starting with "c"
} else if (word.contains("me")) {
// put in your list for words containing "me"
}
}
2つ目のif文は、最初のものが失敗した場合にのみ実行されるため、重複したエントリがない2つのリストになります。
あなたがしようとしていることについてはっきりしていません。あなたは文字列からそれらを削除しようとしていますので、結果は '' cal cri care cool medium melt home ''ですか?もしそうなら、あなたの質問はこれではっきりしません。また、実際に文字列から何かを削除するコードはありません。また、Iterablesとは何ですか?これは標準のJavaライブラリにはないので、それは何ですか? Apache?グアバ?私はその情報なしで何が起こっているのかは分かりませんが、 'removeIf'があなたが作成した' List'からペアのうちの1つを削除しているようです。それは文字列から何も削除していません。 – ajb
また、最初のパターンでは、単語の先頭にあるかどうかに関係なく、「c」が見つかります。 – ajb
@ajbすべてのマッチがリストに保存されました。私はそれらから2番目の正規表現リストから削除しようとしています。 IterablesはGuavaから、私はJava 8関数を使用できませんでした –