Upgrade Regex with a tester() method?
Peter Levart
peter.levart at gmail.com
Tue Jan 22 03:24:37 PST 2013
On 01/22/2013 09:29 AM, Paul Sandoz wrote:
> On Jan 21, 2013, at 6:20 PM, Peter Levart <peter.levart at gmail.com> wrote:
>> Another possible point lambdafication is an idiom that is frequent with using pattern matching - replacement:
>>
>> public class Pattern { ...
>>
>> public String replaceAll(String str, Function<String, String> replacementFunction) {
>> Matcher m = matcher(str);
>> StringBuffer sb = new StringBuffer();
>> while (m.find()) {
>> m.appendReplacement(sb, replacementFunction.apply(m.group(1)));
>> }
>> m.appendTail(sb);
>> return sb.toString();
>> }
>>
>> so one can write:
>>
>> Pattern pattern = Pattern.compile("\\{(.*?)\\}");
>> String msg = pattern.replaceAll(
>> "User's home is: {user.home}, current dir is: {user.dir}",
>> System::getProperty
>> );
>>
> Perhaps those function-based methods would be more appropriate on Matcher as overloads of replaceAll and replaceFirst?
>
> Paul.
That's better Paul, yes, since there is already
Matcher.replaceAll(String replacement). I would also change the function
to take the Matcher instance as the parameter instead of matched group
#1 - more flexible:
public class Matcher { ...
public String replaceAll(Function<Matcher, String>
replacementFunction) {
reset();
boolean result = find();
if (result) {
StringBuffer sb = new StringBuffer();
do {
appendReplacement(sb, replacementFunction.apply(this));
result = find();
} while (result);
appendTail(sb);
return sb.toString();
}
return text.toString();
}
So the above usage becomes:
Pattern pattern = Pattern.compile("\\{(.*?)\\}");
String msg = pattern
.matcher("User's home is: {user.home}, current dir is: {user.dir}")
.replaceAll(m -> System.getProperty(m.group(1)));
Regards, Peter
>
>> This method could then also be overloaded on String as a shortcut without precompiled Pattern instance:
>>
>> public class String {...
>>
>> public String replaceAll(String regex, Function<String, String> replacementFunction) {
>> return Pattern.compile(regex).replaceAll(this, replacementFunction);
>> }
>>
>> so one could write:
>>
>> String msg = "User's home is: {user.home}, current dir is: {user.dir}"
>> .replaceAll("\\{(.*?)\\}", System::getProperty);
>>
More information about the lambda-dev
mailing list