[ 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.