· 需求:
将
<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类型