今天本来在写一篇blog,链接是:http://blog.csdn.net/justinavril/archive/2008/09/27/2989671.aspx   就是论坛里的一个人问的如何匹配一个blog里的IP地址等他需要的信息,帖子的链接是:http://topic.csdn.net/u/20080926/20/9134c188-b7b1-4006-8515-2d5356df8959.html
我的问题就是在匹配IP地址时,是IP V4的地址啊,开始我用的是最基本的:\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3},然后我观察发现前3个字节后面都有一个“.”,所以我就这么写了:[\\d{1,3}.]{3}\\d{1,3},结果硬是不对啊,当我换成:[\\d{1,3}.]{3,}\\d{1,3},就是在3后面加上一个“,”号时,也就是让它至少匹配3次,结果就对了,能去匹配IP地址了,我觉得挺郁闷的啊...为什么正好三次就不行呢?难道还是我哪个弯没绕过来...

解决方案 »

  1.   

    呵呵,你写了三个表达式,没有一个是正确的!\\d{1,3}.\\d{1,3}.\\d{1,3}.\\d{1,3}
    . 号在正则表达式中有特殊的意义,需要转义。[\\d{1,3}.]{3}\\d{1,3} 和 [\\d{1,3}.]{3,}\\d{1,3} 这两个完全是牛头不对马嘴的表达式。
    [\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个。使用 \\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3} 或者 \\d{1,3}(?:\\.\\d{1,3}){3} 试试看。
      

  2.   

    晕  我自己编辑帖子出错了  晕我那个blog里的是对的  我不是复制的 我想问的是[\\d{1,3}\\.]{3,}\\d{1,3}和[\\d{1,3}\\.]{3}\\d{1,3}的区别   这个对吧?
      

  3.   

    还是csdn的正则大师 火龙果 分析的透彻.
    学习.
      

  4.   

    /(\d+)\.(\d+)\.(\d+)\.(\d+)/g  //匹配IP地址的正则表达式
      

  5.   

    import java.util.Scanner;
    import java.util.regex.Pattern;public class IPregex { public static void main(String[] args) {
    final String IP_REGEX = "(?:(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)\\.){3}(?:25[0-5]|2[0-4]\\d|1\\d{2}|[1-9]\\d|\\d)";
    Pattern p = Pattern.compile(IP_REGEX);
    Scanner s = new Scanner(System.in);
    String t = null;
    do {
    if ((t = s.nextLine()) == null) continue;
    if ((t = t.trim()).length() == 0) continue;
    System.out.print("input:");
    System.out.print(t);
    System.out.print(", match:");
    System.out.print(p.matcher(t).matches());
    System.out.println();
    } while (!"exit".equalsIgnoreCase(t));
    }}
      

  6.   


    知道为什么不对么?因为这个表达式就是不正确的。你没弄明白 [\\d{1,3}.]{3} 这个表示啥意思!这个我在 1 楼已经说明过了,即:[\\d{1,3}.] 这个表示匹配 0-9、左大括号、数字1、半角逗号、数字3、右大括号和字符点中的一个。 注意一下“(其)中的一个”,这是字符组“[ ]”的特性所决定的。举个例子:[abc]{3} 表示匹配三次 a 或 b 或 c,匹配到的字符数量总共是 3 个,而并不是你所想的匹配 abc 三次!要让 [\\d{1,3}.]{3}\\d{1,3} 正确,改成组的形式就可以了:(?:\\d{1,3}\\.){3}\\d{1,3}
      

  7.   

    [\\d{1,3}.]{3}\\d{1,3} 中的 [\\d{1,3}.]{3} 这个只能匹配可怜的 3 个字符。blog 中你写的表达式是这样的:String regex = "([\\d{1,3}\\.]{3}\\d{1,3})\\s-\\s-\\s\\[([^\\]]+)\\]\\s\"GET\\s(/[^\"]+)\"\\s"; 根据 ([\\d{1,3}\\.]{3}\\d{1,3}) 后面的条件,这个只能匹配:两个数字 + 点 + 一个或两个或三个数字,
    即 IP 地址最后一段和倒数第二段中的后两个数字。
      

  8.   

    组有两种:(?:  ) 是非捕获组,(  ) 是捕获组的形式,至于两者的区别,可以看看
    http://topic.csdn.net/u/20080503/01/3c82b040-43b9-4b44-847d-07b366285957.html
    13 楼的回复。
      

  9.   

    了解了  我去学习看看  然后把他们测试下  写到blog里  谢谢