当前位置: 首页 > 面试题库 >

Java相当于PHP的preg_replace_callback

琴修为
2023-03-14
问题内容

我正在将应用程序从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做到这一点的理想方法是什么?


问题答案:

我不知道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函数的确切功能。

这是原始照片,因为询问者喜欢它:

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());
        }
    }
}

对于这种特殊的用例,最好只在回调中将每个匹配项排队,然后再向后遍历它们。这将避免在修改字符串时必须重新映射索引。



 类似资料:
  • 问题内容: 我正在寻找一个等效于此php调用的Java: 我使用java.crypto.Mac尝试了此操作,但两者不同意: 键=“ secret”和test =“ test”的输出似乎不匹配。 问题答案: 实际上,他们确实同意。 正如Hans Doggen已经指出的那样,除非将raw输出参数设置为true,否则PHP使用十六进制表示法来输出消息摘要。 如果要在Java中使用相同的符号,可以使用类似

  • 问题内容: 我是Java新手,尽管在PHP方面有很好的经验,并且正在寻找Java中爆炸和爆破(PHP中可用)功能的完美替代品。 我已经用Google搜索了相同的结果,但对结果不满意。任何人对我的问题都有好的解决方案将不胜感激。 例如: 所需的输出: 问题答案: 用于String的Javadoc揭示了您正在寻找的东西。 Java不包括等效的“连接”的“内爆”。您可能只想编写几行代码,而不是像其他答案

  • 问题内容: 我正在将PHP代码迁移到Google App Engine-Java。 因此,我需要使用Java中的PHP的crypt函数, 因为我已经 使用crypt 将注册用户的所有密码存储在数据库中。 编辑1 :这是我的php密码加密代码: $ password =“ test123”; $ pwd = crypt($ password,$ password); 回声$ pwd; 输出为(在 W

  • 问题内容: PHP中的这一行代码评估为true 我需要的是Golang中的一个crypt函数,该函数也将评估为true。 尝试1 我试过了,但评估为假: 尝试2 我还尝试定义和使用在其他地方找到的这个crypt函数,但它也返回false: 所以我的问题是: 我如何获得一个golang地穴功能完全一样的琴弦的PHP crypt函数和? 问题答案: 尽管我还没有找到与PHP的crypt函数完全相同的“

  • 问题内容: 我有这个字符串: 0000000020C90037:TEMP:数据 我需要这个字符串: TEMP:数据。 使用PHP,我可以这样做: 如何像在PHP中一样有效地在JavaScript中使用字符串? 问题答案: 这是您的PHP代码的直接转换:

  • 问题内容: 我在php中将以下语句转换为。 我需要在另一个程序中做同样的事情吗? 有任何想法吗 ? 干杯, 问题答案: 该模块具有,它可以满足您的需求。