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


111

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

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

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


このチェックアウトstackoverflow.com/a/55980176/3593084
Mr.Q

回答:


119

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

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

167

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

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

2
うーん....ビット単位の包含的OR演算...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy

4
これはこれよりもはるかに読みやすく(?i)、Java正規表現はすでにかなり読め
ませんでした

これは4年前のreletの回答と同じ回答ですが、すべての票を獲得します。奇数。
Zoomzoom

私はそれを書いたとき@Zoomzoom、そうではありませんでした:)あなたがreletの版の履歴をチェックすると、あなたはそれが2018年にこれに変更を参照stackoverflow.com/posts/3436124/...
クリスチャンVielma

126

はい、大文字と小文字の区別は、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

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

こちらもご覧ください

  • java.util.regex.Pattern
  • regular-expressions.info/Modifiers
    • 正規表現内のモードの指定
      • /regex/iPattern.CASE_INSENSITIVEJavaで)の代わりに、あなたはすることができます/(?i)regex/
    • 正規表現の一部のみのモードをオンまたはオフにする
      • あなたもすることができます /first(?i)second(?-i)third/
    • モディファイアスパン
      • あなたもすることができます /first(?i:second)third/
  • regular-expressions.info/Word境界(常にaとaの\b間にaが\wあります\s

関連する質問


36

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

答えてくれてありがとう。これはまさに私が探していたものです。Pythonではre.IGNORECASEがJAVAで同様の答えを探していました。
-Doogle

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.