はい、大文字と小文字の区別は、Java regexで自由に有効または無効にできます。
次のようなものが必要なようです:
System.out.println(
"Have a meRry MErrY Christmas ho Ho hO"
.replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
);
// Have a meRry Christmas ho
埋め込まれた Pattern.CASE_INSENSITIVE
フラグは(?i)
そうではないことに注意してください\?i
。また\b
、パターンから余分なものが1つ削除されています。
(?i)
ケース非感受性を可能にするために、パターンの先頭に配置されます。この特定のケースでは、パターンの後半でオーバーライドされないため、実際にはパターン全体で大文字と小文字が区別されません。
実際には、大文字と小文字を区別せずに、パターン全体の一部のみに制限することができます。したがって、どこに配置するかという問題は、実際には仕様によって異なります(ただし、この特定の問題で\w
は、大文字と小文字が区別されないため、問題ではありません。
実証するために、ここのような文字のランを崩壊の同様の例だ"AaAaaA"
だけに"A"
。
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
); // A e I O u
ここで、ランが大文字で始まる場合にのみランを縮小するように指定するとします。次に(?i)
、を適切な場所に配置する必要があります。
System.out.println(
"AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
.replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
); // A eeEeeE I O uuUuUuu
より一般的には、パターン内のフラグを必要に応じて有効または無効にできます。
こちらもご覧ください
関連する質問