У меня возникают проблемы с нечувствительным к регистру шаблоном в 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. Это не соответствует...
Можете ли вы узнать, что я делаю неправильно/совет, как я могу заставить его работать?
Вот решение вашей проблемы, которая, по-видимому, касается равенства 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
phraseToReplace="1-800 flowers.com, "
(без CO. И, следовательно, он не совпадает) ... Я собираюсь решить это сейчас ... извините за эту ошибку, и я действительно ценю твою помощь!