正则表达式替换所有忽略大小写

11

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

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."

我不明白为什么替换空格字符时大小写是个问题。 - drysdam
哦,因为空格必须位于某些不区分大小写的匹配项之间。如果您的语言中没有icase选项,则可以使用反向引用来实现此目的。 - drysdam
4个回答

23

为了进行不区分大小写的搜索和替换,您可以更改

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

3
请注意,在没有使用UNICODE_CASE(?u)标志的情况下,您将无法正确地进行Unicode大小写转换。这在纯ASCII数据上并不重要,但如果您有非ASCII大小写字母(包括仅是拉丁字母的罗马数字),例如“king henryⅷ”和“King Henry Ⅷ”,这些是彼此大小写变体的情况下就很重要了。一个简单的非拉丁语言示例是,“ΣΤΙΓΜΑΣ”、“στιγμας”和“στιγμασ”应该在大小写不敏感的情况下全部匹配,因为希腊字母sigma有三种不同的形式。(是的,我知道“στιγμα”的复数形式实际上是“στιγματα”。 :)) - tchrist
@tchrist,您是否建议将"(?i)[..]"替换为"(?ui)[..]"?这对我有效。 - k3b
@k3b 是的,那就是我的意思。 - tchrist
@tchrist,你刚刚节省了我的时间,谢谢!默认情况下Unicode大小写折叠不起作用,这很奇怪。 - ruX

1

这是我的做法:

        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();
    }

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


1
您可以在进行搜索之前将所有内容转换为小写,或查看正则表达式修饰符Pattern.CASE_INSENSITIVE。

0

您没有指定语言。

Java 中有 Pattern.CASE_INSENSITIVE。

C# 和 VB 中有 RegexOptions.IgnoreCase。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接