Apakah Java RegEx peka huruf besar kecil?

111

Di Java, saat melakukan replaceAll untuk mencari pola regex seperti:

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

(untuk menghapus duplikat kata-kata yang tidak peka huruf besar / kecil, misalnya Tes tes), saya tidak yakin di mana saya meletakkan ?i. Saya membaca bahwa itu seharusnya di awal, tetapi jika saya mengeluarkannya maka saya menangkap kata-kata duplikat berturut-turut (misalnya tes tes), tetapi bukan kata-kata yang tidak peka huruf besar / kecil (misalnya Tes tes). Jadi saya pikir saya bisa menambahkan? Saya di awal tetapi tampaknya tidak menyelesaikan pekerjaan. Ada pemikiran? Terima kasih!

Kristal
sumber

Jawaban:

119

RegexBuddy memberi tahu saya jika Anda ingin memasukkannya di awal, ini adalah sintaks yang benar:

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
cnanney.dll
sumber
168

Anda juga dapat mencocokkan regex yang tidak peka huruf besar / kecil dan membuatnya lebih mudah dibaca dengan menggunakan konstanta Pattern.CASE_INSENSITIVE seperti:

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
Christian Vielma
sumber
2
Mmmm .... operasi OR inklusif bitwise ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy
4
Ini jauh lebih mudah dibaca daripada ini (?i),
ekspresi reguler
Ini adalah jawaban yang sama dengan jawaban relet 4 tahun sebelumnya, namun mendapat semua suara. Aneh.
Zoomzoom
@Zoomzoom, itu bukan ketika saya menulisnya :) jika Anda memeriksa riwayat edisi relet, Anda melihatnya berubah menjadi ini di 2018 stackoverflow.com/posts/3436124/…
Christian Vielma
126

Ya, ketidakpekaan huruf besar / kecil dapat diaktifkan dan dinonaktifkan sesuka hati di regex Java.

Sepertinya Anda menginginkan yang seperti ini:

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

Perhatikan bahwa bendera yang disematkan tidak . Perhatikan juga yang satu itu berlebihanPattern.CASE_INSENSITIVE(?i)\?i\b telah dihilangkan dari pola.

Itu (?i) ditempatkan di awal pola untuk mengaktifkan case-insensitivity. Dalam kasus khusus ini, itu tidak akan diganti nanti dalam pola, jadi pada dasarnya seluruh pola peka huruf besar kecil.

Perlu dicatat bahwa sebenarnya Anda dapat membatasi ketidakpekaan huruf besar / kecil hanya pada sebagian dari keseluruhan pola. Jadi, pertanyaan di mana harus meletakkannya sangat tergantung pada spesifikasinya (meskipun untuk masalah khusus ini sejak itu tidak menjadi masalah\w tidak peka huruf besar / kecil.

Untuk mendemonstrasikan, berikut adalah contoh serupa dari runtuhnya rangkaian huruf like "AaAaaA"to just "A".

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("(?i)\\b([A-Z])\\1+\\b", "$1")
    ); // A e I O u

Sekarang misalkan kita menetapkan bahwa proses hanya boleh diciutkan hanya jika dimulai dengan huruf besar. Kemudian kita harus meletakkannya (?i)di tempat yang sesuai:

    System.out.println(
        "AaAaaA eeEeeE IiiIi OoooOo uuUuUuu"
            .replaceAll("\\b([A-Z])(?i)\\1+\\b", "$1")
    ); // A eeEeeE I O uuUuUuu

Secara lebih umum, Anda dapat mengaktifkan dan menonaktifkan flag apa pun di dalam pola sesuai keinginan.

Lihat juga

Pertanyaan-pertanyaan Terkait

poligenelubricants
sumber
36

Jika seluruh ekspresi Anda tidak membedakan huruf besar / kecil, Anda cukup menentukan CASE_INSENSITIVEpanji:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
relet
sumber
Terima kasih atas jawabannya. Ini persis seperti yang saya cari. Dengan python kami memiliki re.IGNORECASE sedang mencari jawaban serupa di JAVA.
Doogle
0

Anda juga dapat mengarahkan string awal Anda, yang akan Anda periksa kecocokan pola, ke huruf kecil. Dan gunakan dalam pola simbol huruf kecil Anda masing-masing.

Alexander Drobyshevsky
sumber