user2832203
user2832203

Reputation: 75

SubString replacement in text

I want to replace all the occurrences of a string in a text except the first one. for eg:

input: Example [2] This is a sample text. This is a sample text. This is a sample text.

replaced word: sample (sImple)

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

In string functions what I see is replace, replaceAll, replaceFirst.

How should I handle this case.

Thanks in advance.

Upvotes: 0

Views: 140

Answers (6)

walid toumi
walid toumi

Reputation: 2282

Another option:

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

And replacement:

$1yourstring

Java Code:

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

Upvotes: 0

Sandy Gettings
Sandy Gettings

Reputation: 713

There is no built-in function that does exactly what you want, either in the String or StringBuilder classes. You'll need to write your own. Here's a quickie:

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

Upvotes: 0

Braj
Braj

Reputation: 46871

Try with substring and indexOf methods to break it in two string then replace in second string and finally append both the strings back

sample code:

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

combine all in few statements:

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

Upvotes: 0

Pshemo
Pshemo

Reputation: 124275

  • replaceAll and replace will replace all substrings (difference between them is that replaceAll uses regular expression as argument, while replace uses literals).
  • replaceFirst will replace only first substring which will match pattern you want to find.

What you can do is

  • use indexOf(String str, int fromIndex) method to determine indexes of first and second sample word,
  • then substring(int beginIndex) on index of second sample to get part of string from which you want to let replacing possible
  • and call your replace method on this part
  • when replacement is done you can concatenate part which shouldn't be changed (before index of second sample word) and part with replaced values

Other solution would be using appendReplacement and appendTail form Matcher class and use replacing value after you find second sample word. Code for it can look like

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

Output:

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

Upvotes: 0

gtgaxiola
gtgaxiola

Reputation: 9331

Here is a naive approach:

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

Which will give:

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

Upvotes: 0

anubhava
anubhava

Reputation: 785896

You can use this regex to search:

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

And this for replcement:

$1simple

RegEx Demo

Java Code:

String r = input.replaceAll("((?:\\bsample\\b|(?<!^)\\G).*?)\\bsample\\b", "$1simple");

Upvotes: 1

Related Questions