Чи невідчутна регістр Java RegEx?


111

У Java під час заміни ВСЕ шукати шаблон регулярного виразів:

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

(для видалення дублікатів послідовних нечутливих до регістру слів, наприклад тестовий тест), я не впевнений, куди я поставив ?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
Мммм .... побітові включення АБО операції ...Pattern.compile(myregex, Pattern.MULTILINE | Pattern.CASE_INSENSITIVE)
Нік Грілі

4
Це набагато читабельніше, ніж ця (?i)річ, виразки Java вже були
нечитатими

Це та сама відповідь, що і відповідь релета за 4 роки до цього, але вона отримує всі голоси. Незвичайно.
Zoomzoom

@Zoomzoom, це не було , коли я писав це :) , якщо ви перевірити історію видання перездавати в ви бачите , що змінилося на це в 2018 році stackoverflow.com/posts/3436124 / ...
Christian Vielma

126

Так, нечутливість регістру може бути включена та відключена за бажанням у 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

Зауважте, що вбудований Pattern.CASE_INSENSITIVE прапор - (?i)ні \?i. Зауважте також, що одне зайве \bбуло вилучено із шаблону.

Значок (?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/i( Pattern.CASE_INSENSITIVEна Java) можна зробити/(?i)regex/
    • Увімкнення та вимкнення режимів лише для частини регулярного вираження
      • Ви також можете зробити /first(?i)second(?-i)third/
    • Проміжки модифікаторів
      • Ви також можете зробити /first(?i:second)third/
  • regular-expressions.info/Борд межі (завжди є \bміж a \wі a \s)

Пов'язані питання


36

Якщо весь ваш вираз нечутливий до регістру, ви можете просто вказати CASE_INSENSITIVEпрапор:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)

Дякую за відповідь. Це вишукано, що я шукав. У python ми ре.IGNORECASE шукали подібну відповідь у JAVA.
Doogle

0

Ви також можете перевести початкову рядок, який ви збираєтеся перевірити на відповідність шаблону, в малі регістри. І використовуйте у своєму шаблоні малі символи відповідно.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.