Hello,
I implemented 2 null safe methods to replace into a String with regular
expression :
  - String replaceAll(String text, String regex, String replacement);
  - String replaceFirst(String text, String regex, String replacement);


The StringUtils.replacePattern(String source, String regex, String
replacement) method adds Pattern#DOTALL option by default which may be
undesired. Moreover, this methods is not null safe.

I think it could be added to StringUtils.
I opened a JIRA ticket (LANG-1139) and an associated Pull Request (#92)


There is detail :

/**
 * <p>Replaces each substring of the text String that matches the given
regular expression
 * with the given replacement.</p>
 *
 * This method is a {@code null} safe equivalent to:
 * <ul>
 *  <li>{@code text.replaceAll(regex, replacement)}</li>
 *  <li>{@code
Pattern.compile(regex).matcher(text).replaceAll(replacement)}</li>
 * </ul>
 *
 * <p>A {@code null} reference passed to this method is a no-op.</p>
 *
 * <p>Unlike in the {@link #replacePattern(String, String, String)}
method, the {@link Pattern#DOTALL} option
 * is NOT automatically added.
 * To use the DOTALL option prepend <code>"(?s)"</code> to the regex.
 * DOTALL is also know as single-line mode in Perl.</p>
 *
 * <pre>
 * StringUtils.replaceAll(null, *, *)       = null
 * StringUtils.replaceAll("any", null, *)   = "any"
 * StringUtils.replaceAll("any", *, null)   = "any"
 * StringUtils.replaceAll("", "", "zzz")    = "zzz"
 * StringUtils.replaceAll("", ".*", "zzz")  = "zzz"
 * StringUtils.replaceAll("", ".+", "zzz")  = ""
 * StringUtils.replaceAll("<__>\n<__>", "<.*>", "z")      = "z\nz"
 * StringUtils.replaceAll("<__>\n<__>", "(?s)<.*>", "z")  = "z"
 * StringUtils.replaceAll("ABCabc123", "[a-z]", "_")       = "ABC___123"
 * StringUtils.replaceAll("ABCabc123", "[^A-Z0-9]+", "_")  = "ABC_123"
 * StringUtils.replaceAll("ABCabc123", "[^A-Z0-9]+", "")   = "ABC123"
 * StringUtils.replaceAll("Lorem ipsum  dolor   sit", "( +)([a-z]+)",
"_$2") = "Lorem_ipsum_dolor_sit"
 * </pre>
 *
 * @param text  text to search and replace in, may be null
 * @param regex  the regular expression to which this string is to be
matched
 * @param replacement  the string to be substituted for each match
 * @return  the text with any replacements processed,
 *              {@code null} if null String input
 *
 * @throws  PatternSyntaxException
 *              if the regular expression's syntax is invalid
 *
 * @see String#replaceAll(String, String)
 * @see java.util.regex.Pattern
 * @see java.util.regex.Pattern#DOTALL
 */
public static String replaceAll(final String text, final String regex,
final String replacement);

/**
 * <p>Replaces the first substring of the text string that matches the
given regular expression
 * with the given replacement.</p>
 *
 * This method is a {@code null} safe equivalent to:
 * <ul>
 *  <li>{@code text.replaceFirst(regex, replacement)}</li>
 *  <li>{@code
Pattern.compile(regex).matcher(text).replaceFirst(replacement)}</li>
 * </ul>
 *
 * <p>A {@code null} reference passed to this method is a no-op.</p>
 *
 * <p>The {@link Pattern#DOTALL} option is NOT automatically added.
 * To use the DOTALL option prepend <code>"(?s)"</code> to the regex.
 * DOTALL is also know as single-line mode in Perl.</p>
 *
 * <pre>
 * StringUtils.replaceFirst(null, *, *)       = null
 * StringUtils.replaceFirst("any", null, *)   = "any"
 * StringUtils.replaceFirst("any", *, null)   = "any"
 * StringUtils.replaceFirst("", "", "zzz")    = "zzz"
 * StringUtils.replaceFirst("", ".*", "zzz")  = "zzz"
 * StringUtils.replaceFirst("", ".+", "zzz")  = ""
 * StringUtils.replaceFirst("<__>\n<__>", "<.*>", "z")      = "z\n<__>"
 * StringUtils.replaceFirst("<__>\n<__>", "(?s)<.*>", "z")  = "z"
 * StringUtils.replaceFirst("ABCabc123", "[a-z]", "_")          =
"ABC_bc123"
 * StringUtils.replaceFirst("ABCabc123abc", "[^A-Z0-9]+", "_")  =
"ABC_123abc"
 * StringUtils.replaceFirst("ABCabc123abc", "[^A-Z0-9]+", "")   =
"ABC123abc"
 * StringUtils.replaceFirst("Lorem ipsum  dolor   sit", "( +)([a-z]+)",
"_$2")  = "Lorem_ipsum  dolor   sit"
 * </pre>
 *
 * @param text  text to search and replace in, may be null
 * @param regex  the regular expression to which this string is to be
matched
 * @param replacement  the string to be substituted for the first match
 * @return  the text with the first replacement processed,
 *              {@code null} if null String input
 *
 * @throws  PatternSyntaxException
 *              if the regular expression's syntax is invalid
 *
 * @see String#replaceFirst(String, String)
 * @see java.util.regex.Pattern
 * @see java.util.regex.Pattern#DOTALL
 */
public static String replaceFirst(final String text, final String regex,
final String replacement);


Regards,

-- 
Loic Guibert
PGP : 0x65EB4F33


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org
For additional commands, e-mail: dev-h...@commons.apache.org

Reply via email to