我在Java中遇到了不区分大小写的模式。
根据online tools和我的理解,字符串:
"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(我想也许它将点翻译为新线......)并尝试使用Pattern.CASE_INSENSITIVE构建它。 它不匹配...
你能认识到我做错了什么/建议我怎样才能让它发挥作用?
答案 0 :(得分: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