1 多行匹配
2 不以某某开头 ,比如不以www开头
3 不区分大小写
4 2个单元的或操作,比如  www | 3w 都可以这种能否简单给个例子,谢谢。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【tteesstt】截止到2008-06-27 14:10:25的历史汇总数据(不包括此帖):
    发帖数:71                 发帖分:3500               
    结贴数:71                 结贴分:3500               
    未结数:0                  未结分:0                  
    结贴率:100.00%            结分率:100.00%            
    敬礼!
      

  2.   

    2:不以某某开头 ,比如不以www开头
    public class Test {    public static void main(String[] args) {
            String[] strs = {
                    "abc1232",  "wwwadsf",
                    "awwwfas",  "wwadfsf",
                    "", "ww", " ", "www"
                };
            String regex = "(?:(?!^www).)*";
            for(String str : strs) {
                System.out.printf("%-7s %s%n", str, str.matches(regex));
            }
        }
    }(?!X) 专业名称为 Negative Lookahead,表示字符间缝隙后面不允许出现的字符,
    即匹配字符间的缝隙,如果缝隙后的字符不是 X 的话,那这个缝隙就匹配成功。举个例子,aab 和 aac,现有表达式 aa(?!b) 这时我们能匹配到的字符串是 aac,
    因为 aa 的后面的缝隙之后不允许出现字符 b,因此只有 aac 进行了匹配。再来看个示例:public class Test {
        public static void main(String[] args) {
            String str = "AQuickBrownFoxJumpsOverTheLazyDog";
            String[] strs = str.split("(?<!^)(?=[A-Z])");
            for(String s : strs) {
                System.out.println(s);
            }
        }
    }根据大写字母拆分字符串。当然了,这个使用字符串进行分析同样也能进行拆分,
    但是使用正则表达式来拆的话更为便捷直观一些。在进行这种拆分时,由于在拆分后的字符数不能减少,因此只能使用零宽度的
    lookaround 功能进行匹配,lookaround 包括四个,即:(?=X)  (?!X)  (?<=X)  (?<!X)来看一下这个表达式:(?<!^)(?=[A-Z])前面说到过 (?!) 表示缝隙后面不允许出现的东西,而 (?<!) 表示缝隙前不允许出现的东西。
    (?=) 表示缝隙后允许出现的东西,(?<=) 表示缝隙前允许出现的东西。这个表达式在拆分时,根据零宽度匹配缝隙进行拆分的,这个缝隙必须满足以下条件:(?<!^) 表示缝隙不允许前不能是行开始,即缝隙不能出现在首字母的前面。
    (?=[A-Z]) 表示缝隙后面允许出现 A-Z 的大写字母。这时这个表达式就匹配了下面带有 | 的缝隙:
    A|Quick|Brown|Fox|Jumps|Over|The|Lazy|Dog
    PS:不加 (?<!^) 的话,会变成:
    |A|Quick|Brown|Fox|Jumps|Over|The|Lazy|Dog根据 split 的功能,正则表达式处理程序就根据上面的 | 将字符串给拆分开来了。
    3,不区分大小写
    不加任何限制的匹配是匹配分大小写的,但是正则表达式中可以进行改变,
    有两种方式:参数式和内嵌式。来看个示例:import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {    public static void main(String[] args) {        
            String str = "Book";
            Pattern pattern = Pattern.compile("book");
            Matcher matcher = pattern.matcher(str);
            System.out.println(matcher.matches());
        }
    }上面的这个表达式 book 是不能匹配字符串 Book 的,这时我们只要给定编译时的参数就可以了:Pattern pattern = Pattern.compile("book", Pattern.CASE_INSENSITIVE);Pattern.CASE_INSENSITIVE 这是一个 int 类型的常量,值为 2。表示表达式忽略大小写进行区配。如果我们不采用 Pattern 和 Matcher 两个类来匹配的话,只是使用 String 的 matches 方法的话,
    我们就不能指定表达式的编译参数了,这时就需要采用内嵌标志表达式了,与 Pattern.CASE_INSENSITIVE
    对应的内嵌标志表达式是 (?i),它有四种形式:
    1,(?i)
    2,(?-i)
    3,(?i:X)
    4,(?-i:X)
    不带有 - 的是开标志,带有 - 的是关标志。把上面的代码改成这样:public class Test {    public static void main(String[] args) {        
            String str = "Book";
            String regex = "(?i)book";
            System.out.println(str.matches(regex));
        }
    }我们就达到了同样的效果,当然这样并不是最好的,因为字符串中只有 B 是大写的,
    我们没有必要把所有的字符都进行不区分大小写匹配,我们可以在打开标志,用 (?i) 的
    第二种形式马上关掉它:
        String regex = "(?i)b(?-i)ook";这样的话,只有 b 是区分大小写了,而 (?-i) 后面的还是得区分大小写匹配的。这样写
    可能看上去很不顺眼,我们还能使用第 3 种形式直接指定某些字符是不区分大小写的。
        String regex = "(?i:b)ook";这样的表达式与上面的那个在语义上是相同的。就效率上肯定是优于一下子开,一下子关的。可见内嵌标志表达式要比指定编译参数的功能强大许多。使用建议:如果能确定某些字符的大小写时,尽量使用已确定的字符,对于不确定的可以采用
    (?i:X) 的方式指定。因此打开不区分大小写开关时,对匹配的性能是有一定影响的。思考一下:String regex = "(?i)b(?-i:oo)k"; 这个表达式的意思?
    另外:第 1 和第 4,我没看明白需要了解什么,请在下面的楼层中具体地说明一下。
      

  3.   

    1 多行匹配 就是我想匹配
    <tr><td>之间的东西</td></tr>
    可是有时候页面内容是这样的
    <tr>
                   <td>
    我要得东西
                   </td></tr>也就是他们不在一行里面。 也许我可以替换掉里面的换行,但那样的话,格式就不对了,都在一行了。4 就是我想匹配一个图片的链接
    <img src="http://www.google.com/1.gif"/> 或者 <img src="http://3w.google.com/1.gif"/>
    也就是2个任何一个都可以,后面相同,最笨的,我可以匹配2次,不知能否在一次里面匹配呢?
      

  4.   

    1:多行匹配在默认的情况下 . 是不能匹配行结束符的(行结束符有 6 个,具体的可以看看 Pattern 的 API DOC)
    同样,可以像不匹配大小写匹配那样使用编译参数:Pattern.DOTALL如果还得区分大小写的话,还得加上上面说到的 Pattern.CASE_INSENSITIVE 这个,举个例子:import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {    public static void main(String[] args) {
            String str = 
                    "<table>                \n" +
                    "  <tr>                 \n" +
                    "    <td>               \n" +
                    "       Hello World!    \n" +
                    "    </td>              \n" +
                    "  </tr>                \n" +
                    "</table>";
            String regex = "<td>(.+?)</td>";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            while(matcher.find()) {
                System.out.println(matcher.group(1).trim());
            }        
        }
    }上面这个是不能从 str 抽取出东西的,因为 td 的后面带有换行符,我们只要更改一下:Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);这样就行了,如果 td 还得不区分大小写的话,再改成:Pattern pattern = Pattern.compile(regex, Pattern.DOTALL | Pattern.CASE_INSENSITIVE);这样的话,td 哪怕是大写的这个表达式都能把 td 之间的字符区抽取出来。当然和 Pattern.CASE_INSENSITIVE 一样,Pattern.DOTALL 也有内嵌标志表达式,即 (?s)
    s 的意思表示 single-line 就是忽略换行符什么的,只看成单行进行处理。这个表达式使用内嵌 (?s) 的话可以改为:String regex = "(?s)<td>(.+?)</td>";如果还要不区分大小写的话,再加上 i 标志:
    String regex = "(?s)(?i)<td>(.+?)</td>";但这样显得很拖沓,可以把它们合并起来:
    String regex = "(?is)<td>(.+?)</td>";    // 秩序无所谓最后需要说明一下的是,我曾看到过由于不明白 DOTALL,为了让 . 匹配行结束符,直接把表达式写成:String regex = "<td>((.|\\s)+?)</td>";这样做是极其危险的,由于选择结构的匹配效率问题,这样做在比较长的字符串时会造成堆栈溢出,
    使程序崩溃,如果使用 DOTALL 或者 (?s) 的话就不会出现这种情况。
    4:2个单元的或操作| 称为多选结构,用于匹配 | 之中的任何一个,拿你的例子来说明:import java.util.regex.Matcher;
    import java.util.regex.Pattern;public class Test {    public static void main(String[] args) {
            String str = 
                    "<img src=\"http://www.google.com/1.gif\"/>\n" +
                    "<img src=\"http://3w.google.com/1.gif\"/>\n" +
                    "<img src=\"http://abc.baidu.com/1.gif\"/>";
            String regex = "<img\\ssrc=\"http://(?:ww|3)w.google.com/1.gif\"/>";
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            while(matcher.find()) {
                System.out.println(matcher.group());
            }        
        }
    }注意到其中的 (?:ww|3) 在进行多选匹配时尽量找出多选中的规律,以减少多选的字符,
    www 和 3w 在最后一个字符可以共用,前面的不一样。(?: ) 的意思表示组成一组,如果没有 (?: ) 这样的话,表达式就变成了:
    String regex = "<img\\ssrc=\"http://ww|3w.google.com/1.gif\"/>";这样的语义完全变掉了,| 是在一组中进行选择,由于上面的那个表达式中没有组,就把整个表
    达式作为了一组,使用 | 的话,就进行了整个表达式的多选结构了。这个表达式的意思是:
    匹配 <img ssrc="http://ww 或者是 3w.google.com/1.gif"/>,这样的结果并不是我们所要的。我们仅仅需要在 ww 和 3 之间进行选择,这时只要把 ww 和 3 放在一组中进行多选择就可以了,
    变成 (?:ww|3)。还有,在多选结构中尽量把出现频率高的放在前面,这样可以加快匹配速度。多选结构的效率在传统型的引擎中是效率低下的,如果是单个字符的选择,比如 a $ & 之中的一个,
    那就不要使用 (?:a|$|&) 了,可以直接使用字符类 [a$&] 就可以了。说了那么多,不知道是否明白了?
      

  5.   

    CSDN 也真是有毛病,老是要把 |改成 |这种简直就是莫名其妙的替换!
      

  6.   

    bao110908 火龙果@宝家族你的正则太牛了,好好跟你学习学习!
      

  7.   

    public class Test {    public static void main(String[] args) {        
            String str = "Book";
            String regex = "(?i)book";
            System.out.println(str.matches(regex));
        }
    }
      

  8.   

    public class Test {     public static void main(String[] args) {        
            String str = "Book"; 
            String regex = "(?i)book"; 
            System.out.println(str.matches(regex)); 
        } 
    }
      

  9.   

    ***************************************************************************思想决定行动,行动决定习惯,习惯决定命运.
    程序员在深圳QQ群,交流思想,如饮美酒.部份专业群介绍:
    c++群:  15195967(此群流动性相当大,有时候一个月上百人被迫离群)
    java群: 11878667(此群人数较少,但不知道群主会不会让你进群,进群要求很高)
    英语学习群:  23864353(此群人气一般,交流也车不够活跃)
    c++Ⅱ:  17409451(此群是C++第一群的补充,人气自然差点)
    嵌入式开发群:  37489763(此群高手还是有的,气氛一般)
    移动开发群:  31501597(此群人气和氛围都还可以)
    创业群:  33653422(此群名字就注定了讨论的东西一般没有结果.)
    部份高级程序员群(高级群致力于发现和培养专家,人气最旺,淘汰率高,不自信者不要加入):高级群I:17538442
    高级群II:7120862部份初、中级程序员群:
    第三群:2650485
    第五群:29537639
    第四群:28702746
    第六群:10590618
    第七群:10543585
    第八群:12006492
    第九群:19063074
    第十群:2883885
    第十一群:25460595
    第十二群:9663807深圳程序员QQ群联盟成立2005年,拥有三十个以上的QQ群,人数超三千多人,大量高手,从业于大公司(微软、IBM,SUN,华为)、系统分析员(包括参加过上亿元的项目的架构师)。每个人都自信而上进.推荐:深程高级群I:17538442 深程高级群II:7120862 (深程高级群不欢迎新手,如果在深圳,月薪6K以下的别加入) c++:15195967 java群: 11878667  mobile:31501597嵌入式:37489763   
    —————————————————————————————————————————— 
    如果你不是第一次看到此广告,说明我们最近T了一些人,因为我们要不断提升群的质量,保证名副其实.
    -------------------------------------------------------------------------------------
    在通过电邮、新闻组或者聊天室提出技术问题前,检查你有没有做到: 
          1. 通读手册,试着自己找答案。 
          2. 在FAQ里找答案(一份维护得好的FAQ可以包罗万象:)。 
          3. 在网上搜索(个人推荐google~)。 
          4. 向你身边精于此道的朋友打听。 
    我想我们首先应该靠自己解决问题,然后才是问
    ------------------------------------------------------------------------------------------------------技术QQ群是一个体现群体智慧的地方,无价值的发言会给别人带来噪音和负担,如果不同意以上观点的请勿加入!*****************************************************************************
      

  10.   

    又学习了以下,虽说还不是太明白
    我们工作种用到了(?:)
    到现在很没明白是什么意思?,开发得人说是优化内存
    (?:aaaa|bbbb)和(aaaa|bbbb)有什么区别呢