• 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);用来验证相等。



  • 相关阅读:
    vue,如何每次访问同样路由都可以刷新
    CentOS 7.X 关闭SELinux
    Centos7安装Redis
    ubuntu 18.04 安装 MySql,并配置远程连接
    CentOS7设置阿里镜像源
    ubuntu 18.04 设置静态ip方法
    发现网络产品漏洞后,应立即通知上游开发者,并及时通知下游用户
    ApacheCN 数据库译文集 20211112 更新
    ApacheCN Linux 译文集(二) 20211206 更新
    ApacheCN C# 译文集 20211124 更新
  • 原文地址:https://www.cnblogs.com/cl1024cl/p/6205730.html
Copyright © 2020-2023  润新知