文本中的SubString替换

时间:2014-09-08 17:55:46

标签: java regex replace substring

我希望替换除第一个字符串以外的文本中出现的所有字符串。 例如:

输入:示例[2]这是一个示例文本。这是一个示例文本。这是一个示例文本。

替换了单词:sample(sImple)

输出:示例[2]这是一个示例文本。这是 sImple 文字。这是 sImple 文字。

在字符串函数中,我看到的是replace,replaceAll,replaceFirst。

我该如何处理这个案子。

提前致谢。

6 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式进行搜索:

((?:\bsample\b|(?<!^)\G).*?)\bsample\b

这是替换: RegEx Demo

Java代码:

$1simple

答案 1 :(得分:0)

这是一种天真的方法:

public static String replaceAllButFirst(String text, String toReplace, String replacement) {
    String[] parts = text.split(toReplace, 2);
    if(parts.length == 2) {  //Found at least one match
        return parts[0] + toReplace + parts[1].replaceAll(toReplace, replacement);
    } else { //no match found giving original text
        return text;
    }
}

public static void main(String[] args) {
    String x = "This is a sample test. This is a sample test. This is a sample test";
    System.out.println(replaceAllButFirst(x, "sample", "simple"));
}

这将给出:

This is a sample test. This is a simple test. This is a simple test

答案 2 :(得分:0)

  • replaceAllreplace将替换所有子字符串(它们之间的差异是replaceAll使用正则表达式作为参数,而replace使用文字)。
  • replaceFirst将仅替换与您要查找的模式匹配的第一个子字符串。

你能做的是

  • 使用indexOf(String str, int fromIndex)方法确定第一个和第二个sample字的索引,
  • 然后substring(int beginIndex)关于第二个sample的索引,以获取您想要替换的字符串的一部分
  • 并在此部分调用您的replace方法
  • 更换完成后,您可以连接不应更改的部分(第二个sample字的索引之前)和部分替换值

其他解决方案是使用appendReplacementappendTail形式Matcher类,并在找到第二个sample字后使用替换值。它的代码看起来像

String yourString = "Example [2] This is a sample text. This is a sample text. This is a sample text.";
Pattern p = Pattern.compile("sample", Pattern.LITERAL);
Matcher m = p.matcher(yourString);
StringBuffer sb = new StringBuffer();
boolean firstWordAlreadyFound = false;
while (m.find()) {
    if (firstWordAlreadyFound) {
        m.appendReplacement(sb, "sImple");
    } else {
        m.appendReplacement(sb, m.group());
        firstWordAlreadyFound = true;
    }
}
m.appendTail(sb);
String result = sb.toString();
System.out.println(result);

输出:

Example [2] This is a sample text. This is a sImple text. This is a sImple text.

答案 3 :(得分:0)

另一种选择:

(?<=\bsample\b)(.*?)\bsample\b

替换:

$1yourstring

Java代码:

String s=input.replaceAll("(?<=\\bsample\\b)(.*?)\\bsample\\b", "$1yourString");

答案 4 :(得分:0)

尝试使用substringindexOf方法将其分解为两个字符串,然后替换第二个字符串,最后将两个字符串追加回来

示例代码:

String str = "Example [2] This is a sample text. This is a sample text. This is a sample text.";

String findWhat = "sample";
int index = str.indexOf(findWhat) + findWhat.length();

String temp = str.substring(0, index + 1); // first string
str = str.substring(index + 1);            // second string

//replace in second string and combine back
str = temp + str.replace(findWhat, "simple"); // final string
System.out.println(str); 

将所有内容组合在一起:

int index = str.indexOf(findWhat) + findWhat.length();
str = str.substring(0, index + 1) + str.substring(index + 1).replace(findWhat, "simple");

答案 5 :(得分:0)

没有内置函数能够完全符合您的要求,无论是在String还是StringBuilder类中。你需要自己写。这是一个快速的方法:

    private string ReplaceText(string originalText, string textToReplace, string replacementText)
    {
        string tempText;
        int firstIndex, lastIndex;

        tempText = originalText;
        firstIndex = originalText.IndexOf(textToReplace);
        lastIndex = tempText.LastIndexOf(textToReplace);

        while (firstIndex >= 0 && lastIndex > firstIndex)
        {
            tempText = tempText.Substring(0,lastIndex) + replacementText + tempText.Substring(lastIndex + textToReplace.Length);
            lastIndex = tempText.LastIndexOf(textToReplace);
        }

        return tempText;
    }