hujian219 2009-11-02 21:02
浏览 187
已采纳

大家帮我看看 下面这个正则表达式的意思哈!

这是解析电话号码的正则
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

  • 写回答

1条回答 默认 最新

  • rednaxelafx 2009-11-03 01:43
    关注

    [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个数字,这样就完成了最后的匹配。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况