Java中正则表达式

2021-03-09 12:17:22 浏览数 (1)

一、常见的符号的介绍

1.1 预定义字符类

符号

说明

.

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

d

数字:[0-9]

D

非数字: [^0-9]

s

空白字符:[ tnx0Bfr]

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。

  举例:

代码语言:javascript复制
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 "... 不合法");
         
}             //不合法
代码语言:javascript复制
      /*
    匹配
    手机号段只有 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()方法; 根据给定正则表达式的匹配拆分此字符串。返回一个数组。

  举例:

代码语言:javascript复制
    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举例:

代码语言:javascript复制
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中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。

    举例:

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

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

    组group举例:

代码语言:javascript复制
  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,通过引擎对符合规则的子串进行操作,比如取出。

  举例:

代码语言:javascript复制
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()  字符的结束下标(不包含)
        }
    }        

0 人点赞