Java相当于PHP的preg_replace_callback

我正在将一个应用程序从PHP移动到Java,并且在代码中大量使用正则表达式。我遇到了一些在PHP似乎没有一个java等效的东西:

preg_replace_callback()

对于正则表达式中的每个匹配,它调用一个作为参数传递匹配文本的函数。作为示例用法:

$articleText = preg_replace_callback("/\[thumb(\d+)\]/",'thumbReplace', $articleText);
# ...
function thumbReplace($matches) {
   global $photos;
   return "<img src=\"thumbs/" . $photos[$matches[1]] . "\">";
}

什么是在Java中做这个的理想方式?

重要信息:如Kip在注释中指出的,如果匹配的regex与替换字符串匹配,则此类具有无限循环错误。我将把它作为一个练习,让读者解决它,如果必要的话。

我不知道Java中内置的任何类似的东西。你可以滚动自己没有太多的困难,使用Matcher类:

import java.util.regex.*;

public class CallbackMatcher
{
    public static interface Callback
    {
        public String foundMatch(MatchResult matchResult);
    }

    private final Pattern pattern;

    public CallbackMatcher(String regex)
    {
        this.pattern = Pattern.compile(regex);
    }

    public String replaceMatches(String string, Callback callback)
    {
        final Matcher matcher = this.pattern.matcher(string);
        while(matcher.find())
        {
            final MatchResult matchResult = matcher.toMatchResult();
            final String replacement = callback.foundMatch(matchResult);
            string = string.substring(0, matchResult.start()) +
                     replacement + string.substring(matchResult.end());
            matcher.reset(string);
        }
    }
}

然后调用:

final CallbackMatcher.Callback callback = new CallbackMatcher.Callback() {
    public String foundMatch(MatchResult matchResult)
    {
        return "<img src=\"thumbs/" + matchResults.group(1) + "\"/>";
    }
};

final CallbackMatcher callbackMatcher = new CallbackMatcher("/\[thumb(\d+)\]/");
callbackMatcher.replaceMatches(articleText, callback);

请注意,您可以通过调用matchResults.group()或matchResults.group(0)获取整个匹配的字符串,因此没有必要传递回当前字符串状态。

编辑:使它看起来更像是PHP功能的确切功能。

这是原始的,因为asker喜欢它:

public class CallbackMatcher
{
    public static interface Callback
    {
        public void foundMatch(MatchResult matchResult);
    }

    private final Pattern pattern;

    public CallbackMatcher(String regex)
    {
        this.pattern = Pattern.compile(regex);
    }

    public String findMatches(String string, Callback callback)
    {
        final Matcher matcher = this.pattern.matcher(string);
        while(matcher.find())
        {
            callback.foundMatch(matcher.toMatchResult());
        }
    }
}

对于这个特定的用例,最好简单地在回调中对每个匹配进行排序,然后向后遍历它们。这将防止在字符串被修改时重新映射索引。

http://stackoverflow.com/questions/375420/java-equivalent-to-phps-preg-replace-callback

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:Java相当于PHP的preg_replace_callback