Является ли Java RegEx нечувствительным к регистру? - PullRequest
93 голосов
/ 09 августа 2010

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

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

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

Ответы [ 5 ]

133 голосов
/ 03 октября 2014

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

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
120 голосов
/ 09 августа 2010

Да, нечувствительность к регистру можно включать и отключать по желанию в Java regex.

Похоже, вы хотите что-то вроде этого:

    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

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

См. также

Смежные вопросы

103 голосов
/ 09 августа 2010

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

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
17 голосов
/ 09 августа 2010

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
0 голосов
/ 17 января 2014

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...