[ 
https://issues.apache.org/jira/browse/LANG-502?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12752010#action_12752010
 ] 

Henri Yandell commented on LANG-502:
------------------------------------

Given that we have a fast replace method; one question would be whether to add 
a private underlying method and a last argument of boolean ignoreCase. Then 
have it make a couple of string variable copies and if true make the copies 
lowercase. A very slight performance hit for the current replace (two variable 
declarations to existing objects and an if statement on a boolean) and not much 
increase in terms of maintenance.

Other option would be to decide this isn't a common enough need for performance 
to be critical and using regex with /i is the way to go.

> new method StringUtils.replaceIgnoreCase (with patch)
> -----------------------------------------------------
>
>                 Key: LANG-502
>                 URL: https://issues.apache.org/jira/browse/LANG-502
>             Project: Commons Lang
>          Issue Type: Improvement
>         Environment: all
>            Reporter: Flo
>            Priority: Minor
>             Fix For: 3.0
>
>
> 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);
>     }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to