乐趣区

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

以上就是所有内容,心愿能帮忙到大家!

退出移动版