包含点时Java Case不敏感

时间:2014-06-02 13:58:40

标签: java regex

我在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构建它。 它不匹配...

你能认识到我做错了什么/建议我怎样才能让它发挥作用?

1 个答案:

答案 0 :(得分:0)

这是您的问题的解决方案,似乎是String等于忽略大小写而不是不区分大小写的匹配。

回顾一下:

  • (?i)Pattern.CASE_INSENSITIVE标志不区分大小写
  • 您的论坛的输出是匹配的,案例不会与您匹配的文字不同
  • 要比较String忽略大小写,请使用String.equalsIgnoreCase
  • 要比较String忽略案例中的String,请在这两个字词上使用toLowerCasetoUpperCase(警告,在性能方面可能很昂贵)

    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