次の式は、任意の数の連続する単語を見つけるために正しく機能するはずです。照合では大文字と小文字が区別されません。
String regex = "\\b(\\w+)(\\s+\\1\\b)*";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(input);
// Check for subsequences of input that match the compiled pattern
while (m.find()) {
input = input.replaceAll(m.group(0), m.group(1));
}
入力例:Goodbye goodbye GooDbYe
出力例:さようなら
説明:
正規表現:
\ b:単語境界の始まり
\ w +:任意の数の単語文字
(\ s + \ 1 \ b)*:前の単語と一致し、単語の境界を終了する単語が続く任意の数のスペース。*で囲まれた全体は、複数の繰り返しを見つけるのに役立ちます。
グループ化:
m.group(0):上記のケースで一致したグループを含める必要がありますGoodbye goodbye GooDbYe
m.group(1):上記のケースでは、一致したパターンの最初の単語が含まれます。
Replaceメソッドは、連続するすべての一致する単語をその単語の最初のインスタンスで置き換えます。