commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Benedikt Ritter <brit...@apache.org>
Subject Re: [LANG] Adding StringUtils replace by regular expression methods
Date Wed, 21 Oct 2015 06:40:11 GMT
Hello Loic,

sounds good to me. Go for it.

Benedikt

2015-10-20 9:52 GMT+02:00 Loïc Guibert <lafraich@yahoo.fr>:

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


-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message