Uploaded image for project: 'Commons Lang'
  1. Commons Lang
  2. LANG-502

new method StringUtils.replaceIgnoreCase (with patch)

    XMLWordPrintableJSON

    Details

    • Type: Improvement
    • Status: Closed
    • Priority: Minor
    • Resolution: Won't Fix
    • Affects Version/s: None
    • Fix Version/s: None
    • Component/s: lang.*
    • Labels:
      None
    • Environment:

      all

      Description

      Method implementation:

      /**

      • Searches for all appearances of <code>searchString</code> (ignoring case) in <code>text</code> and replaces them by <code>replacement</code>.
      • The difference to {@link String#replace(CharSequence, CharSequence)}

        and

        {@link StringUtils#replace(String, String, String)}

        is that this implementation ignores case.

      • @param text The text in which to do replacements.
      • @param searchString The string to remove from the text (ignoring case).
      • @param replacement The string to put instead of the searchString.
      • @return A new string with all searchString replaced by replacement.
      • @author frickert
        */
        public static String replaceIgnoreCase(String text, String searchString, String replacement)
        {
        String lowerCaseText = text.toLowerCase();
        String lowerCaseSearchString = searchString.toLowerCase();
        StringBuilder sb = new StringBuilder(text);

      int searchStart = 0;
      final int modifierPerReplacement = replacement.length() - searchString.length();
      int sbDrift = 0; // by doing replacements in sb, sb and the text drift off in length and index in case the searchString and the replacement are of different length

      int finding = lowerCaseText.indexOf(lowerCaseSearchString, searchStart);
      while (finding >= 0)

      { sb.replace(finding + sbDrift, finding + sbDrift + searchString.length(), replacement); sbDrift += modifierPerReplacement; searchStart = finding + searchString.length(); finding = lowerCaseText.indexOf(lowerCaseSearchString, searchStart); }

      return sb.toString();
      }

      test cases:

      public void testReplaceIgnoreCase() throws Throwable

      { String is; is = CommonHelpers.replaceIgnoreCase("bobOBOBobOB", "Bob", "Flo"); assertEquals("search really ignores case", "FloOFlooFlo", is); is = CommonHelpers.replaceIgnoreCase("bobOBOBobOB", "Bob", "Flo"); assertEquals("replacement does care about case", "FloOFlooFlo", is); is = CommonHelpers.replaceIgnoreCase("bob bob bob", "Bob", "Florian"); assertEquals("length difference of searchString and replacement > 0", "Florian Florian Florian", is); is = CommonHelpers.replaceIgnoreCase("bob bob bob", "Bob", "Ed"); assertEquals("length difference of searchString and replacement < 0", "Ed Ed Ed", is); is = CommonHelpers.replaceIgnoreCase("GROSS und klein", "und", "&"); assertEquals("originals case is preserved in not replace chars", "GROSS & klein", is); }

        Attachments

          Activity

            People

            • Assignee:
              Unassigned
              Reporter:
              flofh@gmx.de Flo
            • Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: