zoukankan      html  css  js  c++  java
  • java 正则表达式


    一、正则表达式的转义字符\(特殊的两个反斜杠,你闹心不!)

    java中正则表达式要有两个\\,才能达到转义。我写的这个命令是查找以http|ftp|https|file://开头,或是../..开头,或是../开头的所有字符,

    正确是这样的((^(http|ftp|https|file)(://))|^(\\.\\./\\.\\./)|^(\\.\\./)).*

    ^(XXX)是表示以XXX开头的字符串。

    正则表达式中表示数字是“\d”,实际在内存中就是两个字符\和d, 但在java中\就得写成\\,因此在写程序时就是\\d。

    正则表达式一个\表示转义字符,与后面的字符共同组成一个字符集表示项,如\d表示数字。而要输出一个\,就需要两个,将\自身转义为普通字符。

    而输出成“\\”,实际在内存中就是两个字符“\和\”,java中就要分别表示这两个\,每个都必须写成"\\",因此要写成"\\\\"。实际上先要将"\\\\"转换成一个字符串"\\"再交给正则表达式,正则表达式转义一次就刚好匹配一个"\"。

     (java中的存在的转义序列值为“\b、\t、\n、\f、\r、\"、\'、\\”)

      (正则表达式中的元字符:“(、[、{、\、^、-、$、|、}、]、)、?、+、*、+、.”)

      (变态的不包含[^XXX])

    [^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符

    [^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)

    我做了一个测试:[0-9a-z]和[0-9[a-z]]是一个样的,而[^0-9a-z]与[^0-9[a-z]]不同

    先说一下[0-9a-z]和[0-9[a-z]]这两个正则表达式的效果是一样的,

    String regEx = "[0-9[a-z]]";

    //       String regEx = "[0-9a-z]";

           Pattern p = Pattern.compile(regEx);

           Matcher m = p.matcher(str);

           if (m.matches())

             System.out.println("true");

           else

             System.out.println("incorrect");

    测试字符效果都是一样的。

    但是[^0-9a-z] 和[^0-9[a-z]]两个是不同的。

    [^0-9a-z]表的是0到9或是a到z的字符都是不要的,而[^0-9[a-z]]测试结果显示,0到9的字符是incorrect,但a到z却是true。

    可以看出两个是有区别的。

    这个博主讲到很好:http://www.cnblogs.com/kkcheng/archive/2010/02/03/1662821.html

    csdn这个简单易懂,快速入门,但错误太多,比如转义字符“\”写错成“/”:http://blog.csdn.net/kdnuggets/article/details/2526588

    原理性的东西,讲的全面细致:

    http://wenku.baidu.com/view/da1b9fa2b0717fd5360cdcec.html?re=view

    这篇实用性较强,尤其是group,split,replaceall,append,replacement,start,end等函数的使用,注意,后面讲的非常详细:

    http://wenku.baidu.com/link?url=xftbKemj8OuKk5TppsbwwUgzfV1odqRPzD4BWt4mpFf-0gmIXIFiK5PU766yRVd7RcRXKPtwHMNTzdnE5LDE0b1xu3hKcvSuCIn6g4RJHum

    二、细说正则^和$(开头和结尾)

    正则表达式中,^表示作为开头,$表示结尾。

    如匹配以bao开头的字符串为"^bao(.*)";而"(.*)bao$"匹配以bao结尾。

    但要注意,二者单独使用是全文匹配。

    ^bao匹配bao开头的字符串,但正则表达式"^bao"只能匹配字符串bao,而其他字符串baotou、baoqingtian都匹配不了。

    如果要匹配bao开头字符串baoXXX…,要用

                       Stringregex = "^bao";

                       if("baotou".matches(regex)) {

                                 System.out.println("全文匹配1");

                       }

                       Stringall_regex = "^baotou";

                       if("baotou".matches(all_regex)) {

                                 System.out.println("全文匹配2");

                       }

    输出为:全文匹配2。可见只能全文匹配。$结尾标示符也一样,单独用全文匹配。所以"baotou""^baotou$""baotou$"以及"^baotou"这个四个效果一样,都是全文匹配。

             另外,"^$"和"^"会匹配空字符"",

    给出一个综合的例子

             publicstatic void main(String[] args) {

                       String[]filename = { "baotou", "shanghai", "beijing","shenzhen" };

                       Stringregex = "^bao";

                       if(filename[0].matches(regex)) {

                                 System.out.println("全文匹配1");

                       }

                       Stringall_regex = "^bao(.*)";

                       if(filename[0].matches(all_regex)) {

                                 System.out.println("全文匹配2");

                       }

                      

                       Stringteststring = "ttbaotou";

                       Stringregex2 = "(.*)bao(.*)";

                       if(teststring.matches(regex2)) {

                                 System.out.println("匹配开头1");

                       }

                       Stringregex3 = "(.*)^bao(.*)";

                       if(teststring.matches(regex3)) {

                                 System.out.println("匹配开头2");

                       }

                       Stringregex4 = "(.*)^bao(.*)";

                       if("baotou".matches(regex4)) {

                                 System.out.println("匹配开头3");

                       }

    String regex5 = "(.*)bao(.*)";

                       if("baotou".matches(regex4)) {

                                 System.out.println("匹配开头4");

                       }

             }

    输出为:

    全文匹配2

    匹配开头1

    匹配开头3

    匹配开头4

    从例子中可以看出"^bao(.*)"匹配开头,"bao(.*)$"匹配结尾;

    "(.*)^bao(.*)"其实违法,但可以用,和"^bao(.*)"一样。$有类型功能。

    三、正则表达式的使用方法

    从上例子中可以看到正则表达式使用方法:

    1用Pattern类的complie加载正则表达式StringregEx;

    2用Pattern类的Matcher函数加载要匹配的目标字符串;

    3返回的Matcher m执行m.matches()进行实际匹配,匹配上返回真,否则假。

    代码:

    String regEx ="^(\\.\\./\\.\\.).*";

    Pattern p =Pattern.compile(regEx);

    Matcher m =p.matcher("http://,sdkjf,adfa,jjo,lo");

    if (m.matches())

    System.out.println("true");

    Else

    System.out.println("incorrect");

    而String类自身就有字符串匹配函数matches,如"baotou".matches("(.*)bao(.*)"),可以直接使用,来验证自身匹配一个正则表达式。

    String all_regex = "^bao(.*)";

    if ("baotou".matches(all_regex)) {

    System.out.println("全文匹配2");

    }

    另外,String类可以直接用两个函数startsWith()和endsWith()检验字符串开头和结尾

    "baotou".endsWith(suffix);
    "baotou".startsWith(prefix);

    而"baotou".equals(anObject);用来验证相等。



  • 相关阅读:
    hdu 1199 Color the Ball 离散线段树
    poj 2623 Sequence Median 堆的灵活运用
    hdu 2251 Dungeon Master bfs
    HDU 1166 敌兵布阵 线段树
    UVALive 4426 Blast the Enemy! 计算几何求重心
    UVALive 4425 Another Brick in the Wall 暴力
    UVALive 4423 String LD 暴力
    UVALive 4872 Underground Cables 最小生成树
    UVALive 4870 Roller Coaster 01背包
    UVALive 4869 Profits DP
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205730.html
Copyright © 2011-2022 走看看