首页 > java > >java实现正则匹配出多结果,处理后批量置回的功能(即php的preg_replace_callback功能)

java实现正则匹配出多结果,处理后批量置回的功能(即php的preg_replace_callback功能)

时间:2022-04-27浏览次数:

· 需求:

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