正则表达式是什么意思: (.+?)

解决方案 »

  1.   

    点代表任意字符(根据其他Pattern参数,可能包括换行符,默认不包括)
    +代表前面的部分出现1到多次
    *代表前面的部分出现0到多次
    ?代表前面的部分出现1到多次(这个不是+?的?)X+,X*,X?称之为贪婪(Greedy)匹配,只要符合条件,可以一直匹配到最后X+?,X*?,X??称之为勉强(Reluctant)匹配,匹配第一个符合条件的,就终止
    比如:
        System.out.println("abc".replaceAll(".+", "X"));
        System.out.println("abc".replaceFirst(".+", "X"));
        System.out.println("abc".replaceAll(".+?", "X"));
        System.out.println("abc".replaceFirst(".+?", "X"));
    输出
    X // 从a开始,a符合.+,ab符合,abc还符合,所以.+直接对应abc
    X // 同上
    XXX // a符合.+,就终止,然后由于replaceAll的需要,继续从b开始查找替换,共3个符合条件
    Xbc // a符合.+,就终止,然后由于replaceFirst,运行终止,只替换第一个
      

  2.   

    最外面的括号,称之为捕获
    1 类似数学运算的括号(这个建议用非捕获的(?:X)来替代)
    2 可以使用编号在正则表达式中,引用
    比如    System.out.println("abc".replaceAll("(.+?)", "__$1__")); //__a____b____c__又比如,\1是反向引用,指前面的标签中的标签名    System.out.println("<b>test</b>".matches("<(\\w+).*?>.*?</\\1>")); // T
        System.out.println("<b>test</x>".matches("<(\\w+).*?>.*?</\\1>")); // F
        System.out.println("<a href='test.html'>test</a>".matches("<(\\w+).*?>.*?</\\1>")); // T
        System.out.println("<a href='test.html'>test</x>".matches("<(\\w+).*?>.*?</\\1>")); // F