关于java:java实现正则匹配出多结果处理后批量置回的功能即php的pregreplacecallback功能

· 需要:

将
<div>
    <name>小明</name>
    <name>小红</name>
    <name>张三</name>
</div>

解决成:
<div>
    <p>小明</p>
    <p>小红</p>
    <p>张三</p>
</div>

此需要在爬取网页,处理结果时,常常会遇到。

· php的解决办法:

<?php

$str = "
    <div>
        <name>小明</name>
        <name>小红</name>
        <name>张三</name>
    </div>
";

function matchname($m){
    //解决每一个匹配到的后果
    return "<p>".$m[1]."</p>";
}

$res = preg_replace_callback("|<name>(.*?)<\/name>|","matchname", $str);

var_dump($res);

php的解决办法无需解释,一个preg_replace_callback函数就搞定了。

· java的解决办法

import java.util.function.Function;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test {

    public static void main(String[] args) {
        String str =
                "<div>"+
                "\t<name>小明</name>\n" +
                "\t<name>小红</name>\n" +
                "\t<name>张三</name>\n" +
                "\t</div>";

        String res = Test.preg_replace_callback(
            Pattern.compile("<name>(.*?)</name>")
            ,(MatchResult s)-> "<p>"+s.group(1)+"</p>"
            , str
        );
        System.out.println(res);
    }

    //java版preg_replace_callback办法实现
    public static String preg_replace_callback(
        Pattern pattern,
        Function<MatchResult, String> callbackFunc, 
        CharSequence subject
    ) {
        Matcher matchRes = pattern.matcher(subject);
        StringBuffer resString = new StringBuffer();
        while (matchRes.find()) {
            matchRes.appendReplacement(
                resString, 
                callbackFunc.apply(matchRes.toMatchResult())
            );
        }
        matchRes.appendTail(resString);
        return resString.toString();
    }
}

解释:

//1.Function<MatchResult, String> callbackFunc
Function<MatchResult, String> 这个类型代表一个输出为MatchResult,输入为String的函数

//2.(MatchResult s)-> "<p>"+s.group(1)+"</p>"
这是一个匿名函数的写法,也能够写为
(MatchResult s)->{
    return "<p>"+s.group(1)+"</p>"
}

//3.callbackFunc.apply(matchRes.toMatchResult())
apply为应用/利用这个匿名函数,入参为MatchResult类型

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理