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

在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。

  举例:

1public static void checkQQ(){ 2 String qq = "123a45664"; 3 4 String regex = "[1-9]\\d{4,14}"; 5 6 boolean flag = qq.matches(regex); 7 if(flag) 8 System.out.println(qq+"...is ok"); 9 else 10 System.out.println(qq+"... 不合法"); 11 12} //不合法 13 14/* 15 匹配 16 手机号段只有 13xxx 15xxx 18xxxx 17 18 */ 19 public static void checkTel() 20 { 21 String tel = "16900001111"; 22 String telReg = "1[358]\\d{9}"; 23 System.out.println(tel.matches(telReg)); 24 }

  2.2 切割

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

  举例:

1public static void splitDemo() 2 { 3 4 String str = "avg bb geig glsd abc"; 5 String reg = " +";//按照多个空格来进行切割 6 String[] arr = str.split(reg); 7 System.out.println(arr.length); 8 for(String s : arr) 9 { 10 System.out.println(s); 11 } 12 }

  组group举例:

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

  2.3 替换

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

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

    举例:

1public static void replaceAllDemo() 2 { 3 4 String str = "wer1389980000ty1234564uiod234345675f";//将字符串中的数字替换成#。 5 6 str = str.replaceAll("\\d{5,}","#"); 7 8 System.out.println(str); 9 } 10 // wer#ty#uio#f

    组group举例:

1public static void replaceAllDemo() 2 { 3 4 String str1 = "erkktyqqquizzzzzo";//将叠词替换成$. //将重叠的字符替换成单个字母。zzzz->z 5 6 str = str.replaceAll("(.)\\1+","$1"); 7 8 System.out.println(str); 9 } 10 // erktyquizo

  2.4获取

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

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

  举例:

1public static void getDemo() 2 { 3 String str = "yin yu shi wo zui cai de yu yan"; 4 System.out.println(str); 5 String reg = "\\b[a-z]{3}\\b";//匹配只有三个字母的单词 6 7 //将规则封装成对象。 8 Pattern p = Pattern.compile(reg); 9 10 //让正则对象和要作用的字符串相关联。获取匹配器对象。 11 Matcher m = p.matcher(str); 12 13 //System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。 14 //只不过被String的方法封装后,用起来较为简单。但是功能却单一。 15 16 // boolean b = m.find();//将规则作用到字符串上,并进行符合规则的子串查找。 17 // System.out.println(b); 18 // System.out.println(m.group());//用于获取匹配后结果。 19 20 21 while(m.find()) 22 { 23 System.out.println(m.group()); 24 System.out.println(m.start()+"...."+m.end()); 25 // start() 字符的开始下标(包含) 26 //end() 字符的结束下标(不包含) 27 } 28 }

三、总结

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

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

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

点赞
收藏

评论区

加载中...

相关推荐

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

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

Java日期时间API系列31

  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )