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

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

这是解析电话号码的正则
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个数字,这样就完成了最后的匹配。

    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题