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

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

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

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

82 голоса | спросил Crystal 9 AM00000010000000931 2010, 01:21:09

5 ответов


0

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

"(?i)\\b(\\w+)\\b(\\s+\\1)+\\b"
ответил cnanney 9 AM00000010000003931 2010, 01:25:39
0

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

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

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

  • java.util.regex.Pattern
  • normal-expressions.info/Modifiers
    • Указание режимов внутри регулярного выражения
      • Вместо /regex/i (Pattern.CASE_INSENSITIVE в Java), вы можете сделать /(?i)regex/
    • Включение и выключение режимов только для части регулярного выражения
      • Вы также можете сделать /first(?i)second(?-i)third/
    • Диапазон модификаторов
      • Вы также можете сделать /first(?i:second)third/
  • normal-expressions.info/Word Boundaries (всегда есть \b между \w и \s) литий>

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

ответил polygenelubricants 9 PM00000020000002531 2010, 14:20:25
0

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

Pattern mypattern = Pattern.compile(MYREGEX, Pattern.CASE_INSENSITIVE);
Matcher mymatcher= mypattern.matcher(mystring);
ответил Christian Vielma 3 +04002014-10-03T01:30:54+04:00312014bEurope/MoscowFri, 03 Oct 2014 01:30:54 +0400 2014, 01:30:54
0

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

Pattern.compile(regexp, Pattern.CASE_INSENSITIVE)
ответил relet 9 AM00000010000001731 2010, 01:24:17
0

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

ответил Alexander Drobyshevsky 17 Jpm1000000pmFri, 17 Jan 2014 18:06:32 +040014 2014, 18:06:32

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132