Java без учета регистра при включении точки

1

У меня возникают проблемы с нечувствительным к регистру шаблоном в Java.

Согласно онлайн-инструментам и, насколько мне известно, строка:

"1-800 flowers.com, CO."

Если совпадение с шаблоном регулярного выражения:

"(\s|^)((?i)\Q1-800 FLOWERS.COM, CO.\E)(\s|$)"

Но, создавая этот шаблон в Java, он не соответствует...

Я думаю, что проблема связана с чувствительностью к регистру, потому что следующая строка соответствует (я только изменил ".com" на ".COM"):

"1-800 flowers.COM, CO."

Вот как я его создал в Java:

String phraseToReplace="1-800 flowers.com, CO.";
Pattern pattern = Pattern.compile("(\\s|^)((?i)" + Pattern.quote(phraseToReplace) + ")(\\s|$)", Pattern.MULTILINE);

Я пробовал с и без Pattern.MULTILINE (я подумал, может быть, он перевел точку как NEW LINE...), а также попытался построить ее с помощью Pattern.CASE_INSENSITIVE. Это не соответствует...

Можете ли вы узнать, что я делаю неправильно/совет, как я могу заставить его работать?

  • 1
    цветы и цветы не совсем то же самое. Во всяком случае, не на Яве. вы можете попробовать сначала превратить исходную строку в верхний регистр?
  • 0
    Предложение .. Вместо использования \\ s для сопоставления пробелов в начале / конце, почему бы вам не обрезать () строку и не использовать регулярное выражение без \\ s?
Показать ещё 14 комментариев
Теги:

1 ответ

0
Лучший ответ

Вот решение вашей проблемы, которая, по-видимому, касается равенства String игнорирующего случай, а не совпадения с учетом регистра.

Напомним:

  • (?i) или флаги Pattern.CASE_INSENSITIVE соответствуют нечувствительным к регистру
  • Вывод ваших групп - это то, что было сопоставлено, случай не будет отличаться от текста, который вы сопоставляете с
  • Чтобы сравнить случай игнорирования String, используйте String.equalsIgnoreCase
  • Чтобы сравнить String в случае игнорирования String, используйте toLowerCase или toUpperCase на обоих терминах (предупреждение, может быть дорогостоящим с точки зрения производительности)

    String phraseToReplace = "1-800 flowers.com, CO.";
    
    String sentence = "blablabla " + phraseToReplace + " waddawaddawadda";
    Pattern pattern = Pattern.compile("(\\s|^)((?i)" + Pattern.quote(phraseToReplace)
                + ")(\\s|$)", Pattern.MULTILINE);
    Matcher m = pattern.matcher("1-800 flowers.COM, CO.");
    String match = null;
    if (m.matches()) {
        match = m.group(2);
    }
    if (match != null) {
        System.out.printf("Matched: \"%s\"%n", match);
        System.out.printf("Equals to \"phraseToReplace\"? %b%n", match.equals(phraseToReplace));
        System.out.printf("Equals to \"phraseToReplace\" ignoring case? %b%n",
                match.equalsIgnoreCase(phraseToReplace));
        System.out.printf("Contained in \"sentence\"? %b%n", sentence.contains(match));
        System.out.printf("Contained in \"sentence\" ignoring case? %b%n", sentence.toLowerCase().contains(match.toLowerCase()));
    }
    

Вывод

Matched: "1-800 flowers.COM, CO."
Equals to "phraseToReplace"? false
Equals to "phraseToReplace" ignoring case? true
Contained in "sentence"? false
Contained in "sentence" ignoring case? true
  • 0
    Спасибо! Попытка ...
  • 0
    Я запустил код - он работает. Продолжил поиск, почему мой нет, и увидел, что проблема в том, что мое предложение обрезается (из-за другого процесса между клиентом и сервером ...). На самом деле он принимается как phraseToReplace="1-800 flowers.com, " (без CO. И, следовательно, он не совпадает) ... Я собираюсь решить это сейчас ... извините за эту ошибку, и я действительно ценю твою помощь!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню