Java RegEx büyük / küçük harfe duyarlı mı?


111

Java'da, replaceAll yaparken aşağıdaki gibi bir normal ifade kalıbı aramak için:

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

(büyük / küçük harf duyarlı olmayan yinelenen kelimeleri kaldırmak için, örneğin Test testi) ?i,. Başlangıçta olması gerektiğini okudum, ancak eğer çıkarırsam, birbirini izleyen yinelenen kelimeleri (örneğin test testi) yakalarım, ancak büyük / küçük harfe duyarlı olmayan kelimeleri yakalarım (örn. Test testi). Bu yüzden başlangıçta? İ ekleyebileceğimi düşündüm ama bu işi bitirmiş gibi görünmüyor. Düşüncesi olan var mı? Teşekkürler!


Yanıtlar:


119

RegexBuddy , bunu başlangıca dahil etmek istiyorsanız, bunun doğru sözdizimi olduğunu söylüyor:

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

168

Ayrıca, büyük / küçük harfe duyarlı olmayan normal ifadeleri eşleştirebilir ve Pattern.CASE_INSENSITIVE sabitini aşağıdaki gibi kullanarak daha okunaklı hale getirebilirsiniz:

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

2
Mmmm .... bitsel kapsayıcı VEYA işlemleri ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Nick Grealy

4
Bu, bundan çok daha okunaklı (?i), Java
normal ifadeleri

Bu, relet'in 4 yıl önceki cevabıyla aynı cevap, ancak tüm oyları alıyor. Garip.
Zoomzoom

@Zoomzoom, yazdığım zaman değildi :) relet'in baskı geçmişini kontrol ederseniz, 2018 stackoverflow.com/posts/3436124/…
Christian Vielma

126

Evet, büyük / küçük harf duyarlılığı isteğe bağlı olarak Java regex'te etkinleştirilebilir ve devre dışı bırakılabilir.

Görünüşe göre böyle bir şey istiyorsun:

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

Not gömülü Pattern.CASE_INSENSITIVE bayrak (?i)değil \?i. Ayrıca modelden gereksiz bir tane \bçıkarıldığına da dikkat edin.

Büyük (?i)/ küçük harf duyarlılığını etkinleştirmek için modelin başlangıcına yerleştirilir. Bu özel durumda, modelde daha sonra geçersiz kılınmaz, dolayısıyla aslında tüm model büyük / küçük harfe duyarlı değildir.

Aslında, büyük / küçük harf duyarlılığını tüm modelin yalnızca bölümleriyle sınırlayabileceğinizi belirtmek gerekir. Bu nedenle, onu nereye koyacağınız sorusu gerçekten spesifikasyona bağlıdır (ancak bu özel problem için önemli değildir \w, çünkü büyük / küçük harfe duyarlı değildir.

Göstermek için, burada olduğu gibi harflerin ishal çöken benzer bir örnek "AaAaaA"lazım "A".

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

Şimdi, çalışmanın yalnızca büyük harfle başlıyorsa daraltılması gerektiğini belirttiğimizi varsayalım. O zaman (?i)uygun yere koymalıyız :

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

Daha genel olarak, kalıp içindeki herhangi bir bayrağı istediğiniz gibi etkinleştirebilir ve devre dışı bırakabilirsiniz.

Ayrıca bakınız

İlgili sorular


36

İfadenizin tamamı büyük / küçük harfe duyarlı değilse, yalnızca CASE_INSENSITIVEbayrağı belirtebilirsiniz :

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

Cevap için teşekkürler. Bu kesinlikle aradığım şeydi. Python'da re.IGNORECASE JAVA'da benzer bir cevap arıyordu.
Doogle

1

Ayrıca, desen eşleştirmesini kontrol edeceğiniz ilk dizenizi küçük harfe yönlendirebilirsiniz. Ve deseninizde sırasıyla küçük harf sembollerini kullanın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.