web-dev-qa-db-ja.com

Java RegExは大文字と小文字を区別しませんか?

Javaでは、replaceAllを実行して次のような正規表現パターンを探します。

replaceAll("\\?i\\b(\\w+)\\b(\\s+\\1)+\\b", "$1"); 

(大文字と小文字を区別しない重複する単語、たとえばテストテストを削除するため)、?iをどこに置くかわかりません。私はそれが最初にあるはずであると読みましたが、それを取り出すと、重複する連続した単語(たとえばテストテスト)をキャッチしますが、大文字と小文字を区別しない単語(たとえばテストテスト)はキャッチしません。だから私は最初に?iを追加できると思ったが、それは仕事を終わらせるようには見えない。何かご意見は?ありがとう!

97
Crystal

RegexBuddy は、先頭に含めるかどうかを教えてくれます。これは正しい構文です。

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
107
cnanney

次のようなPattern.CASE_INSENSITIVE定数を使用して、大文字と小文字を区別しない正規表現を照合し、読みやすくすることもできます。

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
137

はい、大文字小文字の区別はJava正規表現で自由に有効または無効にできます。

次のようなものが欲しいようです:

    System.out.println(
        "Have a meRry MErrY Christmas ho Ho hO"
            .replaceAll("(?i)\\b(\\w+)(\\s+\\1)+\\b", "$1")
    );
    // Have a meRry Christmas ho

embeddedPattern.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

より一般的には、パターン内の任意のフラグを必要に応じて有効または無効にすることができます。

こちらもご覧ください

関連する質問

120

式全体で大文字と小文字が区別されない場合は、 CASE_INSENSITIVE フラグを指定するだけです。

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
19
relet

また、パターンマッチングを確認する初期文字列を小文字にすることもできます。そして、パターンでそれぞれ小文字の記号を使用します。