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