java 正则表达式

1. 正则表达式生成网站:

正则表达式解析器 | 代码生成器 (bqrdh.com)

正则表达式在线测试工具-rbtree.cn

 

2. 正则表达式介绍

package com.ggh.study;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class RegexStudy {
    public static void main(String[] args) {
        /*正则相关类及方法*/
        //正则对象
        Pattern pattern = Pattern.compile("[a]"); //入参:正则表达式
        //匹配器对象
        Matcher matcher = pattern.matcher("abcabc"); //入参:需要处理的字符串
        // 判断"abcabc"是否与正则表达式"[a]"描述相同
        boolean b1 = matcher.matches();
        // 判断"abcabc"中是否含有符合正则表达式"[a]"描述的子串,如果找到符合条件的子串就返回true并保存找到的子串的起始和结束下标,当再次调用时会从保存的下标处继续往下查找
        boolean b2 = matcher.find();
        // 调用find()时从"abcabc"中找到的符合正则表达式"[a]"描述的子串可以通过group(0)返回,如果需要得到所有符合条件的子串则需要循环执行find()和group(0)
        String group = matcher.group(0);
        // 调用find()时从"abcabc"中找到的符合正则表达式"[a]"描述的子串的起始下标可以通过start()返回,如果需要得到所有符合条件的子串的起始下标则需要反复执行find()和start()
        int startIndex = matcher.start();
        // 调用find()时从"abcabc"中找到的符合正则表达式"[a]"描述的子串的结束下标可以通过end()-1返回,如果需要得到所有符合条件的子串的结束下标则需要反复执行find()和end()-1
        int endIndex = matcher.end() - 1;
        // 返回将"abcabc"中所有符合正则表达式"[a]"描述的子串替换成"A"的新字符串,并不会改变原有字符串只会获取一个新的字符串
        String newStr = matcher.replaceAll("A"); //newStr=="AbcAbc"

        /*正则表达式    jdk1.8.0_202 */
        System.out.println("<以下是在jdk1.8.0_202下运行的结果>");
        //[]
        String regexStr1 = "[a]"; //[a] <==> a    [a][b] <==> ab
        String content1 = "abac";
        Pattern pattern1 = Pattern.compile(regexStr1);
        Matcher matcher1 = pattern1.matcher(content1);
        System.out.println("测试[]的结果:--------------------");
        while (matcher1.find()) {
            System.out.println(matcher1.group());
        }
        //{}描述字符数量    注.一个{}只能描述一个单位([a][b]{2}的含义:{2}仅描述[b]不描述[a] ([a][b]){2}的含义:匹配"abab")
        // {}使用方式1
        String regexStr2 = "[a]{2}"; //[a]{2} <==> a{2} <==> aa    [b]{1}[a]{2} ==> ba{2} ==> baa
        String content2 = "aabbaababc";
        Pattern pattern2 = Pattern.compile(regexStr2);
        Matcher matcher2 = pattern2.matcher(content2);
        System.out.println("测试{}使用方式1的结果:--------------------");
        while (matcher2.find()) {
            System.out.println(matcher2.group());
        }
        // {}使用方式2
        String regexStr3 = "[a]{2,4}"; //表示字符串"aaaa"或"aaa"或"aa"    注.会贪心匹配
        String content3 = "abaaac";
        Pattern pattern3 = Pattern.compile(regexStr3);
        Matcher matcher3 = pattern3.matcher(content3);
        System.out.println("测试{}使用方式2的结果:--------------------");
        while (matcher3.find()) {
            System.out.println(matcher3.group());
        }
        // {}使用方式3
        String regexStr4 = "[a]{2,}"; //表示只有至少连续两个a的字符串    注.会贪心匹配
        String content4 = "abaaac";
        Pattern pattern4 = Pattern.compile(regexStr4);
        Matcher matcher4 = pattern4.matcher(content4);
        System.out.println("测试{}使用方式3的结果:--------------------");
        while (matcher4.find()) {
            System.out.println(matcher4.group());
        }
        //+表示字符数量至少为1    注.一个+只能描述一个单位
        // +使用方式1
        String regexStr5 = "[a]+"; //表示只有至少连续一个a的字符串 [b][a]+ <==> ba+    注.会贪心匹配
        String content5= "abaaac";
        Pattern pattern5 = Pattern.compile(regexStr5);
        Matcher matcher5 = pattern5.matcher(content5);
        System.out.println("测试+使用方式1的结果:--------------------");
        while (matcher5.find()) {
            System.out.println(matcher5.group());
        }
        // +使用方式2
        String regexStr6 = "[a+]"; //表示字符串"a"或者"+"
        String content6= "abaaa+c";
        Pattern pattern6 = Pattern.compile(regexStr6);
        Matcher matcher6 = pattern6.matcher(content6);
        System.out.println("测试+使用方式2的结果:--------------------");
        while (matcher6.find()) {
            System.out.println(matcher6.group());
        }
        //*表示字符数量为任意个(包含0个)     注.一个*只能描述一个单位
        // *使用方式1
        String regexStr7 = "b[a]*"; //表示只有一个b且之后紧跟连续任意个(包含0个)a的字符串    注.会贪心匹配
        String content7= "abaaac";
        Pattern pattern7 = Pattern.compile(regexStr7);
        Matcher matcher7 = pattern7.matcher(content7);
        System.out.println("测试*使用方式1的结果:--------------------");
        while (matcher7.find()) {
            System.out.println(matcher7.group());
        }
        // *使用方式2
        String regexStr8 = "[a*]"; //表示字符串"a"或者"*"
        String content8 = "abaaa*c";
        Pattern pattern8 = Pattern.compile(regexStr8);
        Matcher matcher8 = pattern8.matcher(content8);
        System.out.println("测试*使用方式2的结果:--------------------");
        while (matcher8.find()) {
            System.out.println(matcher8.group());
        }
        //?表示字符数量最多为1(0或1)    注.一个?只能描述一个单位
        // ?使用方式1
        String regexStr9 = "b[a]?"; //表示只有一个b且之后紧跟一个或零个a的字符串    注.会贪心匹配
        String content9 = "abaaac";
        Pattern pattern9 = Pattern.compile(regexStr9);
        Matcher matcher9 = pattern9.matcher(content9);
        System.out.println("测试?使用方式1的结果:--------------------");
        while (matcher9.find()) {
            System.out.println(matcher9.group());
        }
        // ?使用方式2
        String regexStr10 = "[a?]"; //表示字符串"a"或者"?"
        String content10 = "abaaa?c";
        Pattern pattern10 = Pattern.compile(regexStr10);
        Matcher matcher10 = pattern10.matcher(content10);
        System.out.println("测试?使用方式2的结果:--------------------");
        while (matcher10.find()) {
            System.out.println(matcher10.group());
        }
        //-表示某字符到某字符之间的任意字符
        // -使用方式1
        String regexStr11 = "[a-c]"; //表示字符串"a"或者"b"或者"c"
        String content11 = "a-dc-";
        Pattern pattern11 = Pattern.compile(regexStr11);
        Matcher matcher11 = pattern11.matcher(content11);
        System.out.println("测试-使用方式1的结果:--------------------");
        while (matcher11.find()) {
            System.out.println(matcher11.group());
        }
        // -使用方式2
        String regexStr12 = "[a-]"; //表示字符串"a"或者"-"
        String content12 = "a-dc-";
        Pattern pattern12 = Pattern.compile(regexStr12);
        Matcher matcher12 = pattern12.matcher(content12);
        System.out.println("测试-使用方式2的结果:--------------------");
        while (matcher12.find()) {
            System.out.println(matcher12.group());
        }
        // -使用方式3
        String regexStr13 = "[a]-"; //表示只有连续连个字符且左边是a右边是-的字符串    [a]- <==> a-
        String content13 = "a-dc-";
        Pattern pattern13 = Pattern.compile(regexStr13);
        Matcher matcher13 = pattern13.matcher(content13);
        System.out.println("测试-使用方式3的结果:--------------------");
        while (matcher13.find()) {
            System.out.println(matcher13.group());
        }
        //.表示任意字符
        // .使用方式1
        String regexStr14 = "[a]."; //表示只有连续连个字符且左边是a右边是任意字符的字符串
        String content14 = "a-adc-a.";
        Pattern pattern14 = Pattern.compile(regexStr14);
        Matcher matcher14 = pattern14.matcher(content14);
        System.out.println("测试.使用方式1的结果:--------------------");
        while (matcher14.find()) {
            System.out.println(matcher14.group());
        }
        // .使用方式2
        String regexStr15 = "[.]"; //表示字符串"."
        String content15 = "a-adc-a.";
        Pattern pattern15 = Pattern.compile(regexStr15);
        Matcher matcher15 = pattern15.matcher(content15);
        System.out.println("测试.使用方式2的结果:--------------------");
        while (matcher15.find()) {
            System.out.println(matcher15.group());
        }
        //^ 当^用在[]中时表示取反,当^用在[]外表示字符串开头    注.当^用在[]中时一个^描述多个单位
        // ^使用方式1
        String regexStr16 = "[^ab]"; //表示只有除了a和b字符之外的一个字符的字符串    注.当^用在[]中时要放在开头才表示取反,否则表示匹配字符^
        String content16 = "abc-ab";
        Pattern pattern16 = Pattern.compile(regexStr16);
        Matcher matcher16 = pattern16.matcher(content16);
        System.out.println("测试^使用方式1的结果:--------------------");
        while (matcher16.find()) {
            System.out.println(matcher16.group());
        }
        // ^使用方式2
        String regexStr17 = "^[a]"; //表示只有开头一个a的字符串    "^[a]?[b]"表示字符串"ab"或者"b"
        String content17 = "abc-ab";
        Pattern pattern17 = Pattern.compile(regexStr17);
        Matcher matcher17 = pattern17.matcher(content17);
        System.out.println("测试^使用方式2的结果:--------------------");
        while (matcher17.find()) {
            System.out.println(matcher17.group());
        }
        //$表示结尾
        String regexStr18 = "[b]$"; //表示只有结尾一个b的字符串
        String content18 = "abc-ab";
        Pattern pattern18 = Pattern.compile(regexStr18);
        Matcher matcher18 = pattern18.matcher(content18);
        System.out.println("测试$的结果:--------------------");
        while (matcher18.find()) {
            System.out.println(matcher18.group());
        }
        //|表示或    注.一个|^描述多个单位
        // |使用方式1
        String regexStr19 = "[a][b]|[c][d]"; //表示字符串"ab"或者"cd"    [a][b]|[c][d] ==> ab|cd
        String content19 = "ab-|cb";
        Pattern pattern19 = Pattern.compile(regexStr19);
        Matcher matcher19 = pattern19.matcher(content19);
        System.out.println("测试|使用方式1的结果:--------------------");
        while (matcher19.find()) {
            System.out.println(matcher19.group());
        }
        // |使用方式2
        String regexStr20 = "[a|b]"; //表示字符串"a"或者"|"或者"b"
        String content20 = "ab-|cb";
        Pattern pattern20 = Pattern.compile(regexStr20);
        Matcher matcher20 = pattern20.matcher(content20);
        System.out.println("测试|使用方式2的结果:--------------------");
        while (matcher20.find()) {
            System.out.println(matcher20.group());
        }
        //\\b表示字符串边界
        String regexStr21 = "[a]\\b"; //表示只有连续连个字符其中左边是a右边是字符串边界(开头 结尾 \n \r 空格 Tab)的字符串    "[a\\b]" ==> 正则语法错误    "[a\b]" ==> 表示字符串"a"或者"\b"(退格符)
        String content21 = "a1\rb-|a ca2bab";
        Pattern pattern21 = Pattern.compile(regexStr21);
        Matcher matcher21 = pattern21.matcher(content21);
        System.out.println("测试\\\\b的结果:--------------------");
        while (matcher21.find()) {
            System.out.println(matcher21.group());
        }
        //\\B表示非字符串边界
        String regexStr22 = "[a]\\B"; //表示只有连续连个字符其中左边是a右边是非字符串边界(开头 结尾 \n \r 空格 Tab)的字符串    "[a\\B]" ==> 正则语法错误    "[a\B]" ==> 正则语法错误
        String content22 = "a1\rb-|a ca2bab";
        Pattern pattern22 = Pattern.compile(regexStr22);
        Matcher matcher22 = pattern22.matcher(content22);
        System.out.println("测试\\\\B的结果:--------------------");
        while (matcher22.find()) {
            System.out.println(matcher22.group());
        }
        //\\d表示数字字符
        String regexStr23 = "[a]\\d"; //表示只有连续连个字符其中左边是a右边是数字字符的字符串    "[a\\d]" ==> 表示字符串"a"或者数字字符    "[a\d]" ==> 正则语法错误
        String content23 = "a1\rb-|a ca2bab" ; //
        Pattern pattern23 = Pattern.compile(regexStr23);
        Matcher matcher23 = pattern23.matcher(content23);
        System.out.println("测试\\\\d的结果:--------------------");
        while (matcher23.find()) {
            System.out.println(matcher23.group());
        }
        //\\D表示非数字字符
        String regexStr24 = "[a]\\D"; //表示只有连续连个字符其中左边是a右边是非数字字符的字符串    "[a\\D]" ==> 表示字符串"a"或者非数字字符    "[a\D]" ==> 正则语法错误
        String content24 =  "a1\rb-|a ca2bab";
        Pattern pattern24 = Pattern.compile(regexStr24);
        Matcher matcher24 = pattern24.matcher(content24);
        System.out.println("测试\\\\D的结果:--------------------");
        while (matcher24.find()) {
            System.out.println(matcher24.group());
        }
        //\\s表示空白字符(空格、制表符、回车符、换页符、换行符等)
        String regexStr25 = "[a]\\s"; //表示只有连续连个字符其中左边是a右边是空白字符    "[a\\s]" ==> 表示字符串"a"或者空白字符    "[a\s]" ==> 正则语法错误
        String content25 = "a1\rb-|a ca2bab";
        Pattern pattern25 = Pattern.compile(regexStr25);
        Matcher matcher25 = pattern25.matcher(content25);
        System.out.println("测试\\\\s的结果:--------------------");
        while (matcher25.find()) {
            System.out.println(matcher25.group());
        }
        //\\S表示非空白字符(空格、制表符、回车符、换页符、换行符等)
        String regexStr26 = "[a]\\S"; //表示只有连续连个字符其中左边是a右边是非空白字符    "[a\\S]" ==> 表示字符串"a"或者空白字符    "[a\S]" ==> 正则语法错误
        String content26 = "a1\rb-|a ca2bab";
        Pattern pattern26 = Pattern.compile(regexStr26);
        Matcher matcher26 = pattern26.matcher(content26);
        System.out.println("测试\\\\S的结果:--------------------");
        while (matcher26.find()) {
            System.out.println(matcher26.group());
        }
        //\\w表示数字或字符或_
        String regexStr27 = "[a]\\w"; //表示只有连续连个字符其中左边是a右边是数字字符或者字母字符或者_    "[a\\w]" <==> "[aA-Za-z0-9_]"    "[a\w]" ==> 正则语法错误
        String content27 = "a1\rb-|a ca天bab_";
        Pattern pattern27 = Pattern.compile(regexStr27);
        Matcher matcher27 = pattern27.matcher(content27);
        System.out.println("测试\\\\w的结果:--------------------");
        while (matcher27.find()) {
            System.out.println(matcher27.group());
        }
        //\\W表示非数字且非字符且非_
        String regexStr28 = "[a]\\W"; //表示只有连续连个字符其中左边是a右边是非数字字符且非字母字符且非_    "[a\\W]" <==> "[a]|[^A-Za-z0-9_]"    "[a\W]" ==> 正则语法错误
        String content28 = "a1\rb-|a ca天bab_";
        Pattern pattern28 = Pattern.compile(regexStr28);
        Matcher matcher28 = pattern28.matcher(content28);
        System.out.println("测试\\\\W的结果:--------------------");
        while (matcher28.find()) {
            System.out.println(matcher28.group());
        }
        //()
        // ()使用方式
        String regexStr29 = "([a])([b]([c]))"; //表示字符串"abc"    当使用find()找到"abc"时,可以使用group(1)、group(2)、group(3)分别获取"abc"中的"a"、"bc"、"b"
        String content29 = "abcdef";
        Pattern pattern29 = Pattern.compile(regexStr29);
        Matcher matcher29 = pattern29.matcher(content29);
        System.out.println("测试()使用方式的结果:--------------------");
        while (matcher29.find()) {
            System.out.println(matcher29.group(0));
            System.out.println(matcher29.group(1));
            System.out.println(matcher29.group(2));
            System.out.println(matcher29.group(3));
        }
        // (?<>)使用方式
        String regexStr30 = "(?<g1>[a])(?<g2>[b](?<g3>[c]))"; //表示字符串"abc"    当使用find()找到"abc"时,可以使用group("g1")、group("g2")、group("g3")分别获取"abc"中的"a"、"bc"、"b"
        String content30 = "abcdef";
        Pattern pattern30 = Pattern.compile(regexStr30);
        Matcher matcher30 = pattern30.matcher(content30);
        System.out.println("测试(?<>)使用方式的结果:--------------------");
        while (matcher30.find()) {
            System.out.println(matcher30.group(0));
            System.out.println(matcher30.group(1));
            System.out.println(matcher30.group("g1"));
            System.out.println(matcher30.group(2));
            System.out.println(matcher30.group("g2"));
            System.out.println(matcher30.group(3));
            System.out.println(matcher30.group("g3"));
        }
        // (?:|)使用方式
        String regexStr31 = "a(?:b|cd)"; //ab|acd
        String content31 = "abdacd";
        Pattern pattern31 = Pattern.compile(regexStr31);
        Matcher matcher31 = pattern31.matcher(content31);
        System.out.println("测试(?:|)使用方式的结果:--------------------");
        while (matcher31.find()) {
            System.out.println(matcher31.group());
        }
        // (?=|)使用方式
        String regexStr32 = "a(?=b|cd)"; //(a)(b|cd)加上find()加上group(1)
        String content32 = "abdacd";
        Pattern pattern32 = Pattern.compile(regexStr32);
        Matcher matcher32 = pattern32.matcher(content32);
        System.out.println("测试(?=|)使用方式的结果:--------------------");
        while (matcher32.find()) {
            System.out.println(matcher32.group());
        }
        // (?!|)使用方式
        String regexStr33 = "a(?!b|cd)"; // 与a(?=b|cd)作用相反
        String content33 = "abdacdac";
        Pattern pattern33 = Pattern.compile(regexStr33);
        Matcher matcher33 = pattern33.matcher(content33);
        System.out.println("测试(?!|)使用方式的结果:--------------------");
        while (matcher33.find()) {
            System.out.println(matcher33.group());
        }
        // (?i)使用方式    注.一个(?i)描述多个单位
        String regexStr34 = "[a](?i)[b][c]"; //表示字符串"abc"且b与c不区分大小写
        String content34 = "abcaBC";
        Pattern pattern34 = Pattern.compile(regexStr34);
        Matcher matcher34 = pattern34.matcher(content34);
        System.out.println("测试(?i)使用方式的结果:--------------------");
        while (matcher34.find()) {
            System.out.println(matcher34.group());
        }
        //\\数字(表示外部分组引用) 与 $数字(表示内部分组引用)
        String regexStr35 = "(.)\\1{1}"; //表示只有任意连续两个重复字符的字符串    (.)\\1{1} ==> (.)\\1;
        String content35 = "aabb";
        Pattern pattern35 = Pattern.compile(regexStr35);
        Matcher matcher35 = pattern35.matcher(content35);
        System.out.println("测试\\\\数字的结果:--------------------");
        while (matcher35.find()) {
            System.out.println(matcher35.group());
        }
        String afterReplaceStr = matcher35.replaceAll("$1"); //将匹配到的"aa"与"bb"分别替换为"a"与"b" 结果得到"ab"
        System.out.println("测试$数字的结果:--------------------");
        System.out.println(afterReplaceStr);
    }
}

3. 正则表达式实例运行结果

<以下是在jdk1.8.0_202下运行的结果>
测试[]的结果:--------------------
a
a
测试{}使用方式1的结果:--------------------
aa
aa
测试{}使用方式2的结果:--------------------
aaa
测试{}使用方式3的结果:--------------------
aaa
测试+使用方式1的结果:--------------------
a
aaa
测试+使用方式2的结果:--------------------
a
a
a
a
+
测试*使用方式1的结果:--------------------
baaa
测试*使用方式2的结果:--------------------
a
a
a
a
*
测试?使用方式1的结果:--------------------
ba
测试?使用方式2的结果:--------------------
a
a
a
a
?
测试-使用方式1的结果:--------------------
a
c
测试-使用方式2的结果:--------------------
a
-
-
测试-使用方式3的结果:--------------------
a-
测试.使用方式1的结果:--------------------
a-
ad
a.
测试.使用方式2的结果:--------------------
.
测试^使用方式1的结果:--------------------
c
-
测试^使用方式2的结果:--------------------
a
测试$的结果:--------------------
b
测试|使用方式1的结果:--------------------
ab
测试|使用方式2的结果:--------------------
a
b
|
b
测试\\b的结果:--------------------
a
测试\\B的结果:--------------------
a
a
a
测试\\d的结果:--------------------
a1
a2
测试\\D的结果:--------------------
a 
ab
测试\\s的结果:--------------------
a 
测试\\S的结果:--------------------
a1
a2
ab
测试\\w的结果:--------------------
a1
ab
测试\\W的结果:--------------------
a 
a天
测试()使用方式的结果:--------------------
abc
a
bc
c
测试(?<>)使用方式的结果:--------------------
abc
a
a
bc
bc
c
c
测试(?:|)使用方式的结果:--------------------
ab
acd
测试(?=|)使用方式的结果:--------------------
a
a
测试(?!|)使用方式的结果:--------------------
a
测试(?i)使用方式的结果:--------------------
abc
aBC
测试\\数字的结果:--------------------
aa
bb
测试$数字的结果:--------------------
ab

进程已结束,退出代码0
posted @ 2022-06-14 00:05  略乏旅人  阅读(197)  评论(0)    收藏  举报