[jira] Created: (LANG-502) new method StringUtils.replaceIgnoreCase (with patch)

View: New views
4 Messages — Rating Filter:   Alert me  

[jira] Created: (LANG-502) new method StringUtils.replaceIgnoreCase (with patch)

by JIRA jira@apache.org :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message

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] Commented: (LANG-502) new method StringUtils.replaceIgnoreCase (with patch)

by JIRA jira@apache.org :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


    [ 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] Updated: (LANG-502) new method StringUtils.replaceIgnoreCase (with patch)

by JIRA jira@apache.org :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


     [ 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] Commented: (LANG-502) new method StringUtils.replaceIgnoreCase (with patch)

by JIRA jira@apache.org :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


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