Java中正则表达式的使用(常用的方法)(转)

Wesley13
• 阅读 591

在JDK1.3及之前的JDK版本中并没有包含正则表达式的类,如果要在Java中使用正则表达式必须使用第三方提供的正则表达式库。从JDK1.4开始提供了支持正则表达式API,它们位于java.util.regex包中。

一、常见的符号的介绍

  1.1  预定义字符类

符号

说明

    .

任何字符(与行结束符可能匹配也可能不匹配)

    \d

数字:[0-9]

    \D

非数字: [^0-9]

    \s

空白字符:[ \t\n\x0B\f\r]

    \S

非空白字符:[^\s]

    \w

单词字符:[a-zA-Z_0-9]

    \W

非单词字符:[^\w]

*\*

转义字符,比如"\\"匹配"\"    ,"\{"匹配"{"。

  1.2 数量词

符号

说明

   *

等价于{0,}

   匹配0至多个在它之前的字符。例如正则表达式“zo*”能匹配“z”以及“zoo”;正则表达式“.*”意味着能够匹配任意字符串。

   +

等价于{1,}

   匹配前面的子表达式一次或多次。例如正则表达式9+匹配9、99、999等。

    ?

等价于{0,1}

    匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。此元字符还有另外一个用途,就是表示非贪婪模式匹配,后边将有介绍

   {n}

匹配确定的 n 次。例如,“e{2}”不能匹配“bed”中的“d”,但是能匹配“seed”中的两个“e”。

  {n,}

至少匹配_n_次。例如,“e{2,}”不能匹配“bed”中的“e”,但能匹配“seeeeeeeed”中的所有“e”。

  {n,m}

最少匹配 n 次且最多匹配 m 次。“e{1,3}”将匹配“seeeeeeeed”中的前三个“e”。

  1.3 边界匹配符号

符号

说明

   ^

行的开头

   $

行的结尾

   \b

单词边界

   \B

非单词边界

   \A

输入的开头

   \G

上一个匹配的结尾

   \Z

输入的结尾,仅用于最后的结束符(如果有的话)

   \z

输入的结尾

   1.3 其他常见符号

[]的使用--或

说明

[]

匹配括号中的任何一个字符

   [abc]

a、b 或 c(简单类)

   [^abc]

任何字符,除了 a、b 或 c(否定)

   [a-zA-Z]

a 到 z 或 A 到 Z,两头的字母包括在内(范围)

   [a-d[m-p]]

a 到 d 或 m 到 p:[a-dm-p](并集)

   [a-z&&[def]]

d、e 或 f(交集)

   [a-z&&[^bc]]

a 到 z,除了 b 和 c:[ad-z](减去)

   [a-z&&[^m-p]]

a 到 z,而非 m 到 p:[a-lq-z](减去)

   ()的使用  -- 组

 

    ()

将 () 之间括起来的表达式定义为“组”(group),并且将匹配这个表达式的字符保存到一个临时区域,这个元字符在字符串提取的时候非常有用。捕获组可以通过从左到右计算其开括号来编号。

      (\d)

 第一组

     ((A)(B(C)))

 第一组  ((A)(B(C)))   第二组 (A)   第三组(B(C))  第四组(C)

  PS:更多其他符号,可参照 http://www.cnblogs.com/Mustr/p/6057159.html

二、常见的操作

  2.1 匹配

    String  matches()方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。

  举例:

public static void checkQQ(){
        String qq = "123a45664";

        String regex = "[1-9]\\d{4,14}";

        boolean flag = qq.matches(regex);
        if(flag)
            System.out.println(qq+"...is ok");
        else
            System.out.println(qq+"... 不合法");
         
}             //不合法

/*
    匹配
    手机号段只有 13xxx 15xxx 18xxxx

    */
    public static void checkTel()
    {
        String tel = "16900001111";
        String telReg = "1[358]\\d{9}";
        System.out.println(tel.matches(telReg));
    }

  2.2 切割

     String split()方法;       根据给定正则表达式的匹配拆分此字符串。返回一个数组。

  举例:

public static void splitDemo()
        {
    
        String str = "avg   bb   geig   glsd   abc";
        String reg = " +";//按照多个空格来进行切割
        String[] arr = str.split(reg);  
        System.out.println(arr.length);
        for(String s : arr)
        {
            System.out.println(s);
        }
    }

  组group举例:

public static void splitDemo()
        {
    
        String str = "erkktyqqquizzzzzo";
        String reg ="(.)\\1+";//按照叠词来进行切割
            //可以将规则封装成一个组。用()完成。组的出现都有编号。
            //从1开始。 想要使用已有的组可以通过  \n(n就是组的编号)的形式来获取。
        String[] arr = str.split(reg);  
        System.out.println(arr.length);
        for(String s : arr)
        {
            System.out.println(s);
        }
    }  
     // er,ty,ui,o

  2.3 替换

    String replaceAll(regex,str)方法;     使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。

      ps:如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

    举例:

public static void replaceAllDemo()
    {
    
        String str = "wer1389980000ty1234564uiod234345675f";//将字符串中的数字替换成#。
 
        str = str.replaceAll("\\d{5,}","#");

        System.out.println(str);
    }
        // wer#ty#uio#f

    组group举例:

public static void replaceAllDemo()
    {
    
        String str1 = "erkktyqqquizzzzzo";//将叠词替换成$.  //将重叠的字符替换成单个字母。zzzz->z
 
        str = str.replaceAll("(.)\\1+","$1");

        System.out.println(str);
    }
        // erktyquizo

  2.4获取

      ----将字符串中的符合规则的子串取出。

    操作步骤:
    1,将正则表达式封装成对象。
    2,让正则对象和要操作的字符串相关联。
    3,关联后,获取正则匹配引擎。
    4,通过引擎对符合规则的子串进行操作,比如取出。

  举例:

public static void getDemo()
    {
        String str = "yin yu shi wo zui cai de yu yan";
        System.out.println(str);
        String reg = "\\b[a-z]{3}\\b";//匹配只有三个字母的单词

        //将规则封装成对象。
        Pattern p = Pattern.compile(reg);

        //让正则对象和要作用的字符串相关联。获取匹配器对象。
        Matcher m  = p.matcher(str);

        //System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
        //只不过被String的方法封装后,用起来较为简单。但是功能却单一。

       // boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
       // System.out.println(b);
       // System.out.println(m.group());//用于获取匹配后结果。
        
        
        while(m.find())
        {
            System.out.println(m.group());
            System.out.println(m.start()+"...."+m.end());
                // start()  字符的开始下标(包含)
                //end()  字符的结束下标(不包含)
        }
    }

三、总结

  什么情况下使用什么方法呢??????  

    思路方式:
    1,如果只想知道该字符是否对是错,使用匹配。
    2,想要将已有的字符串变成另一个字符串,替换。
    3,想要按照自定的方式将字符串变成多个字符串。切割。获取规则以外的子串。
    4,想要拿到符合需求的字符串子串,获取。获取符合规则的子串。

 以上内容是常用方式的总结,想使用好java正则,多去研究 pattern  和 matcher 两个对象,。。都在java.util.regex包下。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
AJPFX总结关于Java中过滤出字母、数字和中文的正则表达式
1、Java中过滤出字母、数字和中文的正则表达式(1)过滤出字母的正则表达式\^(AZaz)\(2)过滤出数字的正则表达式\^(09)\(3)过滤出中文的正则表达式\^(\\\\u4e00\\\\u9fa5)\(4)过滤出字母、数字和中文的正则表达式\^(azAZ09\\\\u
Stella981 Stella981
2年前
JavaScript中的正则表达式详解
摘要:javascript中的正则表达式作为相当重要的知识,本文将介绍正则表达式的相关知识和用法。正则表达式(RegularExpression)是一门简单语言的语法规范,是强大、便捷、高效的文本处理工具,它应用在一些方法中,对字符串中的信息实现查找、替换和提取操作。正则表达式在人们的印象中可能是一堆无法理解的字符,但就是这些符号却实现
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这