Java String replace once

Introduction

Replaces a String with another String inside a larger String, once.

A null reference passed to this method is a no-op.

replaceOnce(null, *, *)        = null
replaceOnce("", *, *)          = ""
replaceOnce("any", null, *)    = "any"
replaceOnce("any", *, null)    = "any"
replaceOnce("any", "", *)      = "any"
replaceOnce("aba", "a", null)  = "aba"
replaceOnce("aba", "a", "")    = "ba"
replaceOnce("aba", "a", "z")   = "zba"
public class Main {
  public static void main(String[] argv) throws Exception {
    String text = "CSS CSS HTML HTML";
    String searchString = "CSS";
    String replacement = "C++";
    System.out.println(replaceOnce(text, searchString, replacement));
  }//from   w w w  . j  av  a2s  . c om

  public static String replaceOnce(String text, String searchString, String replacement) {
    return replace(text, searchString, replacement, 1);
  }

  public static String replace(String text, String searchString, String replacement) {
    return replace(text, searchString, replacement, -1);
  }

  public static String replace(String text, String searchString, String replacement, int max) {
    if (isEmpty(text) || isEmpty(searchString) || replacement == null || max == 0) {
      return text;
    }
    int start = 0;
    int end = text.indexOf(searchString, start);
    if (end == -1) {
      return text;
    }
    int replLength = searchString.length();
    int increase = replacement.length() - replLength;
    increase = (increase < 0 ? 0 : increase);
    increase *= (max < 0 ? 16 : (max > 64 ? 64 : max));
    StringBuffer buf = new StringBuffer(text.length() + increase);
    while (end != -1) {
      buf.append(text.substring(start, end)).append(replacement);
      start = end + replLength;
      if (--max == 0) {
        break;
      }
      end = text.indexOf(searchString, start);
    }
    buf.append(text.substring(start));
    return buf.toString();
  }

  public static boolean isEmpty(String str) {
    return str == null || str.length() == 0;
  }
}

/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */



PreviousNext

Related