|
|
|
JIRA jira@apache.org
|
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 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. |
||||||||||||||||
|
JIRA jira@apache.org
|
[ https://issues.apache.org/jira/browse/LANG-502?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12727140#action_12727140 ] Henri Yandell commented on LANG-502: ------------------------------------ Need to compare performance against regex with a i flag. > 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 > > 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. |
||||||||||||||||
|
JIRA jira@apache.org
|
In reply to this post
by JIRA jira@apache.org
[ https://issues.apache.org/jira/browse/LANG-502?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Henri Yandell updated LANG-502: ------------------------------- Fix Version/s: 3.0 > 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. |
||||||||||||||||
|
JIRA jira@apache.org
|
In reply to this post
by JIRA jira@apache.org
[ 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. |
||||||||||||||||
| Free Embeddable Forum Powered by Nabble | Help |