commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Loic Guibert <lguib...@apache.org>
Subject Re: [LANG] Adding StringUtils replace by regular expression methods
Date Tue, 20 Oct 2015 07:53:57 GMT
Hello,
I proposed some time ago to add in StringUtils 2 null safe methods
to replace into a String with regular expression
and I'd like to hear opinions about that.

I opened a JIRA ticket (LANG-1139) :
https://issues.apache.org/jira/browse/LANG-1139

and an associated Pull Request (#92) :
https://github.com/apache/commons-lang/pull/92


Moreover, there is an existing method
(which add Pattern#DOTALL option by default) :
  * StringUtils.replacePattern(String source, String regex, String
replacement)
that is not null safe.

I think to modify it to follow the same behavior as the 2 new methods:
  * StringUtils.replacePattern(null, *, *)     = null
  * StringUtils.replacePattern("any", null, *) = "any"
  * StringUtils.replacePattern("any", *, null) = "any"

This will impact this method :
  * removePattern(String source, String regex)
as it calls "replacePattern(source, regex, StringUtils.EMPTY);"
and it'll become null safe to.

In addition to the 2 new replace methods,
I could also add the pending remove methods :

  - String removeAll(String text, String regex);
  - String removeFirst(String text, String regex);


If nobody objects, I'll go on and commit the proposed changes.


Loic Guibert
PGP : 0x65EB4F33


Le 28/05/2015 16:42, Loic Guibert a écrit :
> 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,
>


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


Mime
View raw message