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

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

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

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


person Crystal    schedule 08.08.2010    source источник
comment
проверьте это stackoverflow.com/a/55980176/3593084   -  person Mr.Q    schedule 04.05.2019


Ответы (5)


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

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
person cnanney    schedule 08.08.2010

Вы также можете сопоставить регулярные выражения без учета регистра и сделать их более читаемыми с помощью константы Pattern.CASE_INSENSITIVE, например:

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
person Christian Vielma    schedule 02.10.2014
comment
Это гораздо более читабельно, чем эта (?i) штука, регулярные выражения Java уже были совершенно нечитаемыми: S - person Bartek Banachewicz; 30.11.2016

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

В общем, вы можете включать и отключать любой флаг в шаблоне по своему желанию.

Смотрите также

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

person polygenelubricants    schedule 09.08.2010

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
person relet    schedule 08.08.2010
comment
Спасибо за ответ. Именно это я и искал. В python у нас есть re.IGNORECASE, который искал аналогичный ответ в JAVA. - person Doogle; 03.02.2019
comment
Правда, с некоторыми кириллическими символами и немецкими умляутами он работать не будет. - person azhidkov; 21.06.2021

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

person Alexander Drobyshevsky    schedule 17.01.2014