【问题标题】:regex replace all ignore case正则表达式替换所有忽略大小写
【发布时间】:2011-04-06 14:32:17
【问题描述】:

如何在以下示例中忽略大小写?

outText = inText.replaceAll(word, word.replaceAll(" ", "~"));

例子:

输入:

inText = "Retail banking Wikipedia, the free encyclopedia Retail banking "
       + "From Wikipedia. retail banking industry."

word   = "retail banking"

输出

outText = "Retail~banking Wikipedia, the free encyclopedia Retail~banking " +
          "From Wikipedia. retail~banking industry."

【问题讨论】:

  • 我不明白为什么替换空格字符时会出现大小写问题。
  • 哦,因为空格必须在某些不区分大小写的匹配之间。如果您的语言中没有 icase 选项,则后面的 refs 可以这样做。

标签: java regex


【解决方案1】:

做不区分大小写的查找和替换,可以改

outText = inText.replaceAll(word, word.replaceAll(" ", "~"));

进入

outText = inText.replaceAll("(?i)" + word, word.replaceAll(" ", "~"));

避免破坏原大写:

但是,在上述方法中,您破坏了被替换单词的大写。这是一个更好的建议:

String inText="Sony Ericsson is a leading company in mobile. " +
              "The company sony ericsson was found in oct 2001";
String word = "sony ericsson";

Pattern p = Pattern.compile(word, Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(inText);

StringBuffer sb = new StringBuffer();

while (m.find()) {
  String replacement = m.group().replace(' ', '~');
  m.appendReplacement(sb, Matcher.quoteReplacement(replacement));
}
m.appendTail(sb);

String outText = sb.toString();

System.out.println(outText);

输出:

Sony~Ericsson is a leading company in mobile.
The company sony~ericsson was found in oct 2001

【讨论】:

  • 请注意,如果没有 UNICODE_CASE(?u) 标志,您将无法获得正确的 Unicode 大小写折叠。这对于纯 ASCII 数据无关紧要,但如果您有非 ASCII 大小写字母,包括拉丁字母,如罗马数字,如 king henry ⅷKing Henry Ⅷ,它们是彼此的大小写变体。一个简单的非拉丁语示例是 ΣΤΙΓΜΑΣστιγμαςστιγμασ 都应该不区分大小写地相互匹配,因为希腊语 sigma 具有三种不同的形式。 (是的,我知道στιγμα 的复数形式确实是στιγματα。:)
  • @tchrist 你打算用“(?ui)[..]”替换“(?i)[..]”吗?这对我有用。
  • @k3b 是的,我就是这个意思。
  • @tchrist 你只是在节省我的时间,谢谢!奇怪的是,默认情况下 unicode casefolding 不能开箱即用
【解决方案2】:

您可以在进行搜索之前将其全部转换为小写,或者查看正则表达式修饰符 Pattern.CASE_INSENSITIVE

【讨论】:

    【解决方案3】:

    这是我的做法:

            private String replaceAllIgnoreCase(final String text, final String search, final String replacement){
            if(search.equals(replacement)) return text;
            final StringBuffer buffer = new StringBuffer(text);
            final String lowerSearch = search.toLowerCase(Locale.CANADA);
            int i = 0;
            int prev = 0;
            while((i = buffer.toString().toLowerCase(Locale.CANADA).indexOf(lowerSearch, prev)) > -1){
                buffer.replace(i, i+search.length(), replacement);
                prev = i+replacement.length();
            }
            return buffer.toString();
        }
    

    在我的范围内似乎完美无缺。以我的方式这样做的好处是我的解决方案中没有正则表达式,这意味着如果您想替换括号或加号(或任何其他元字符),它实际上会替换文本的实际内容是,而不是它在正则表达式中的含义。希望这有帮助。

    【讨论】:

      【解决方案4】:

      您没有指定语言。

      Java 有 Pattern.CASE_INSENSITIVE

      C# 和 VB 都有 RegexOptions.IgnoreCase

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-28
        • 1970-01-01
        • 2018-04-07
        相关资源
        最近更新 更多