这是解析电话号码的正则
String i="67343333-103";
Pattern p=Pattern.compile("([0-9]{2,5})[-_ ]+([0-9]{5,8})[-_ ]+([0-9]{1,4})|(([0-9]{2,5})[-_ ]*)?([0-9]{5,})");
Matcher m= p.matcher(i);
i=m.replaceAll("[a href=\"phone:$1$2$3$5$6\"]$0[/a]");
System.out.println(i);
运行出来的结果是
[a href="phone:67343333"]67343333[/a]-103
请问一下 代码中的$1 $2 $3 $4$5$6 分别表示匹配哪个部分呀 如果我换成
i=m.replaceAll("[a href=\"phone:$1\"]$0[/a]");
打印出来的结果就是
[a href="phone:"]67343333[/a]-103
[code="java"]"([0-9]{2,5})[-_ ]+([0-9]{5,8})[-_ ]+([0-9]{1,4})|(([0-9]{2,5})[-_ ]*)?([0-9]{5,})"[/code]
对字符串"67343333-103",
$0是整个正则表达式匹配到的内容,在这里是67343333
$1是([0-9]{2,5})匹配到的内容,在这里是空串,因为这个正则表达式匹配的是第二个分支
$2是([0-9]{5,8})匹配到的内容,在这里是空串,理由同上
$3是([0-9]{1,4})匹配到的内容,在这里是空串,理由同上
$4是(([0-9]{2,5})[-_ ]*)匹配到的内容,在这里是
$5是([0-9]{2,5})匹配到的内容,在这里是673
$6是([0-9]{5,})匹配到的内容,在这里是43333
本来[0-9]{2,5}是会贪婪匹配到5个数字的,但如果前面占了5个,后面的([0-9]{5,})就不够用了,于是前面就回溯到只匹配4个数字,再尝试匹配后面,还是不行,然后回溯到前面只匹配3个数字,这样就完成了最后的匹配。