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.