Java-正则表达式-入门与简单使用

Java-正则表达式-入门与简单使用

引子

别忘了import java.util.regex.*;

别忘了import java.util.regex.*;

别忘了import java.util.regex.*;

 

什么是正则表达式?

    ——专门用于操作字符串的技术,并且可以简化代码,用于对字符串的复杂操作。

 

正则表达式的优势?

    ——在Java中引入正则表达式的概念来解决对字符串的操作,且可以简化代码。

是字符串处理的神器。

 

正则表达式的弊端?

    ——代码可读性比较差。

 

多说无益,我们直接看几个例子来大致了解一下正则表达式。

 

例子1:

boolean flag = QQ.matches("[1-9][0-9]{4,11}");

这行代码可以完成对一串数字是否满足QQ号要求的检查,要求如下:

  1. 第一位不能是零;2、QQ号码在5到12之间(包含);3、QQ号码都是由数字组成;

 

例子2:

String tel = "13628123409"; 引号内可以是任意一串数字

String telReg = "1[358]\\d{9}";

System.out.println(tel.matches(telReg));

 

上述代码可以检查tel是否满足手机号码必须是11位数,而且必须是13、15、18开头的要求。

 

正则表达式主要有以下三个功能:

1). 字符串匹配

2). 字符串切割

3). 字符串替换

1). 字符串查找和获取

 

 

基础知识

双斜杠 // 的使用:

对java的解释器来说,在反斜线字符(/)前的字符有特殊的含义。因此需要用双反斜线字符(//)。此外圆括号在正则表达中两层含义,如果想让它解释为字面上意思(即圆括号),也需要在它前面用双反斜线字符(/)。

几个正则表达式的匹配规则表:

 

 

 

代码

说明

.

匹配除换行符以外的任意字符

\w

匹配字母或数字或下划线或汉字

\s

匹配任意的空白符

\d

匹配数字

^

匹配字符串的开始

$

匹配字符串的结束

\b

匹配字符串的结束

代码/语法

说明

*

重复零次或更多次

+

重复一次或更多次

?

重复零次或一次

{n}

重复n次

{n,}

重复n次或更多次

{n,m}

重复n到m次

 

代码/语法

说明

\W

匹配任意不是字母,数字,下划线,汉字的字符

\S

匹配任意不是空白符的字符

\D

匹配任意非数字的字符

\B

匹配不是单词开头或结束的位置

[^x]

匹配除了x以外的任意字符

[^aeiou]

匹配除了aeiou这几个字母以外的任意字符

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

语法

说明

*?

重复任意次,但尽可能少重复

+?

重复1次或更多次,但尽可能少重复

??

重复0次或1次,但尽可能少重复

{n,m}?

重复n到m次,但尽可能少重复

{n,}?

重复n次以上,但尽可能少重复

 

语法

说明

\xhh

十六进制值为0xhh的字符

\uhhhh

十六进制表示为0xhhhh的Unicode字符

\t

制表符Tab

\n

换行符

\r

回车

\f

换页

\e

转义(Escape)

 

 

字符串匹配

需要使用String中的matches(); 函数,可以判断字符串对象是否匹配正则表达式。

1)如果匹配,则返回true;

2)如果不匹配,则返回false;

 

例子1:

String str = "123456789";

String reg = "\\d+";

boolean b= str.matches(reg);

System.out.println(b);

即用正则表达式来判断字符串中是否全部是数字

 

例子2:

    String tel = "13628123409";

String telReg = "1[358]\\d{9}";

System.out.println(tel.matches(telReg));

用于匹配13、15、18开头的11位数手机号码。

在"1[358]\\d{9}"中:

    "1"表示第一位只能是数字1,

[358]表示第二位的之可以取"358"中的任意一个,

"{9}"表示\d有9位,也就是说数字有几位。

 

字符串切割

 

String str = "erkkrkwjgggcbvnbbbunno";

         String reg = "(.)\\1+";

         String[] arr = str.split(reg);

         System.out.println("切割得到的长度是:" + arr.length);

         for(final String s : arr) {

         System.out.println(s);

         }

结果:

 

 

字符串替换

使用 replaceAll() 函数。

例子:

String str = "寻寻觅觅冷冷清清,凄凄惨惨戚戚,乍暖还寒时候,最难将息";

         str = str.replaceAll("(.)\\1+","$1");        

         System.out.println(str);

结果:

寻觅冷清,凄惨戚,乍暖还寒时候,最难将息

 

 

 

字符串查找和获取

调用Pattern类matcher函数,str作为字符串,生成一个匹配器对象matcher;

调用Matcher类中find()函数去字符串str中查找根据指定的正则表达式的结果,找到返回结果true,找不到返回false;

 

package new1;

 

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class Zhengzedemo {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

         String str = "寻寻觅觅冷冷清清,凄凄惨惨戚戚,110011,乍暖还寒时候,最难将息";

         str = str.replaceAll("(.)\\1+","$1");        

         System.out.println(str);

        

         String regex="\\d{3}";

         Pattern p=Pattern.compile(regex);

         Matcher m=p.matcher(str);

         if(m.find()) {

             System.out.println("嘿嘿嘿");

            

         }

 

    }

}

结果:

寻觅冷清,凄惨戚,101,乍暖还寒时候,最难将息

嘿嘿嘿

将regex内换成需要的正则,套用这套代码,即可完成正则表达式的字符串查找。

 

 

利用while语句,可以将查找到的字符串提取出来

package new1;

 

import java.util.regex.Matcher;

import java.util.regex.Pattern;

 

public class Zhengzedemo {

 

    public static void main(String[] args) {

        // TODO Auto-generated method stub

         String str = "abc 124 ewqeq qeqe qeqe qeqe aaaa fs fsdfs d sf sf sf sf sfada dss dee ad a f s f sa a'lfsd;'l";

         Pattern pt = Pattern.compile("\\b\\w{3}\\b");

         Matcher match = pt.matcher(str);

         while (match.find()) {

         System.out.println(match.group());

         }

         }

 

    

}

结果:

abc

124

dss

dee

 

希望这些能给予你一点帮助。

posted @ 2021-04-15 19:40  软壳玩家  阅读(235)  评论(0)    收藏  举报