Является Java RegEx без учета регистра?

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

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

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

98
задан Qwertiy 19 May 2019 в 22:31
поделиться

3 ответа

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

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
108
ответ дан 24 November 2019 в 05:07
поделиться

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
22
ответ дан 24 November 2019 в 05:07
поделиться

Да, нечувствительность к регистру можно по желанию включать и отключать в регулярном выражении 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) второй (? - i) третий /
    • Диапазон модификаторов
      • Вы также можете сделать / первый (? i: второй) третий /
  • regular-expressions.info/Word Boundaries ( всегда есть \ b между \ w и \ s )

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

121
ответ дан 24 November 2019 в 05:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: