Является ли Java RegEx нечувствительным к регистру?

111

В Java при выполнении replaceAll поиск шаблона регулярного выражения, например:

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

(чтобы удалить повторяющиеся последовательные слова без учета регистра, например, Test test), я не уверен, куда я положил ?i. Я прочитал, что он должен быть в начале, но если я вытащу его, я поймаю повторяющиеся последовательные слова (например, тестовый тест), но не слова без учета регистра (например, тестовый тест). Поэтому я подумал, что могу добавить? I в начале, но, похоже, это не помогает. Есть предположения? Спасибо!

Кристалл
источник
проверьте это stackoverflow.com/a/55980176/3593084
Мистер Кью

Ответы:

119

RegexBuddy сообщает мне, если вы хотите включить его в начало, это правильный синтаксис:

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
cnanney
источник
168

Вы также можете сопоставлять нечувствительные к регистру регулярные выражения и сделать их более читабельными с помощью константы 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)
Ник Грили 01
4
Это гораздо более читабельно, чем эта (?i)штука, регулярные выражения Java уже были совершенно нечитаемы: S
Bartek Banachewicz
Это тот же ответ, что и ответ Relet 4 года назад, но он получил все голоса. Странный.
Zoomzoom
@Zoomzoom, это было не тогда, когда я писал это :) если вы проверите историю редакции relet, вы увидите, что она изменилась на это в 2018 году stackoverflow.com/posts/3436124/…
Кристиан Вильма,
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регистр не учитывается.

Чтобы продемонстрировать, вот аналогичный пример сворачивания серий букв 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

Теперь предположим, что мы указываем, что запуск должен быть свернут, только если он начинается с заглавной буквы. Затем мы должны поместить (?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/Word Boundaries ( \bмежду a \wи a всегда есть a \s)

Связанные вопросы

полигенные смазочные материалы
источник
36

Если все ваше выражение нечувствительно к регистру, вы можете просто указать CASE_INSENSITIVEфлаг:

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
пересдавать
источник
Спасибо за ответ. Именно это я и искал. В python у нас есть re.IGNORECASE искал аналогичный ответ в JAVA.
Doogle
1

Вы также можете перевести исходную строку, которую вы собираетесь проверить на соответствие шаблону, в нижний регистр. И используйте в своем шаблоне символы нижнего регистра соответственно.

Александр Дробышевский
источник