Skip to content

表达式语法


获取元字符文档资料

https://pan.baidu.com/s/1hNC1vSXbkvOGnHNJS0SqaQ?pwd=3tn6 提取码: 3tn6

元字符分类

(1)限定符

(2)选择匹配符

(3)分组组合和反向引用符

(4)特殊字符

(5)字符匹配符

(6)定位符

转义符号 \\

基本介绍

使用正则表达式去检索某些特殊字符的时候,需要用到转义符号,否则检索不到结果,甚至会报错

注意点:在 Java 正则表达式中,两个反斜杠( \\ ) 代表其他语言的一个反斜杠( \ )(不区分是(1)普通反斜杠(2)还是转义反斜杠的反斜杠),因为反斜杠 ( \ ) 有特殊含义(例如 \d 表示数字)

alt text

使用场景

如需匹配以下符号,在正则表达式中需要在该符号前加上转义符号(两个反斜杠表示一个反斜杠

.   *    +    (    )    $    /    \    ?    [    ]    ^    {    }

字符匹配符

[ ]

包含列表中的任意一个字符即满足匹配条件

举例:String regStr = "[0-9]"; // 匹配 0-9 之间任意一个字符

[ ^ ]

不包含列表中的任意一个字符(包括数字和特殊符号

举例:String regStr = "[^0-9]"; // 不在 0-9 之间任意一个字符

 -

连字符,表示范围内的任意字符

举例:String regStr="[a-z]"; // 匹配 a-z 之间任意一个字符

 .

匹配除了\n 的所有字符,如果需要匹配本身需要使用转义符即( \\. )

举例:String regStr="."; // 匹配所有字符

\\d

匹配单个数字字符(0-9),等价于[0-9]

举例:String regStr = "\\d"; // 匹配 0-9 之间任意一个字符

\\D

匹配除了 0-9的任意字符,等价于[^0-9]

举例:String regStr = "\\D"; // 匹配不在 0-9 的任意一个字符

\\w

匹配数字、下划线、大小写字符,等价于[0-9a-zA-Z]

举例:String regStr = "\\w"; // 匹配大小写英文字母, 数字,下划线

\\W

匹配单个数字字符(0-9),等价于[^0-9a-zA-Z]

举例:String regStr = "\\W"; // 匹配等价于[^0-9a-zA-Z]

\\s

匹配任何空白字符(空格,制表符等)

举例:String regStr = "\\s"; // 匹配任何空白字符(空格,制表符等)

\\S

匹配除了任何空白字符(空格,制表符等)

举例:String regStr = "\\S"; // 匹配非空白字符

(?i)

加上后不区分大小写,作用于符号后的所有字符,如果需要指定字符,需要使用括号包起来

1. (?i)abc 表示 abc 都不区分大小写

2. a(?i)bc 表示 bc 不区分大小写

3. a((?i)b)c 表示只有 b 不区分大小写

举例:String regStr="(?i)abc"; // 匹配 abc 字符串(不区分大小写)

指定参数不区分大小写

Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);

示例代码

java
package RegularExpresstion;

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

/**
 * ClassName: test
 * Package: RegularExpresstion
 * Description:
 *
 * @author jacksonling
 * @version 1.0
 * @Date 2025-08-02 20:24
 */
public class Main {
    public static void main(String[] args) {
        // 匹配内容
        String content = "_ Aa124563bB@";

        // 创建模式对象(即正则表达式对象)

        // 第一组
        Pattern pattern = Pattern.compile("[0-3]"); // 只匹配 0-3 范围的字符
        /*
            匹配内容:1
            匹配内容:2
            匹配内容:3
         */

        // 第二组
//        Pattern pattern = Pattern.compile("[^0-3]"); // 除了 0-3 范围的字符都匹配
        /*
            匹配内容:_
            匹配内容:
            匹配内容:A
            匹配内容:a
            匹配内容:4
            匹配内容:5
            匹配内容:6
            匹配内容:b
            匹配内容:B
            匹配内容:@
         */

        // 第三组
//        Pattern pattern = Pattern.compile("[a-b]"); // 只匹配 a-b 范围的字符
        /*
            匹配内容:a
            匹配内容:b
         */

        // 第四组
//        Pattern pattern = Pattern.compile("[^a-b]"); // 除了 a-b 范围的字符都匹配
        /*
            匹配内容:_
            匹配内容:
            匹配内容:A
            匹配内容:1
            匹配内容:2
            匹配内容:4
            匹配内容:5
            匹配内容:6
            匹配内容:3
            匹配内容:B
            匹配内容:@
         */

        // 第五组
//        Pattern pattern = Pattern.compile("."); // 匹配所有字符
        /*
            匹配内容:_
            匹配内容:
            匹配内容:A
            匹配内容:a
            匹配内容:1
            匹配内容:2
            匹配内容:4
            匹配内容:5
            匹配内容:6
            匹配内容:3
            匹配内容:b
            匹配内容:B
            匹配内容:@
         */

        // 第六组
//        Pattern pattern = Pattern.compile("\\d"); // 只匹配 0-9 的字符
        /*
            匹配内容:1
            匹配内容:2
            匹配内容:4
            匹配内容:5
            匹配内容:6
            匹配内容:3
         */

        // 第七组
//        Pattern pattern = Pattern.compile("\\D"); // 匹配除了0-9 的字符
        /*
            匹配内容:_
            匹配内容:
            匹配内容:A
            匹配内容:a
            匹配内容:b
            匹配内容:B
            匹配内容:@
         */

        // 第八组
//        Pattern pattern = Pattern.compile("\\w"); // 匹配数字、下划线、大小写字符
        /*
            匹配内容:_
            匹配内容:A
            匹配内容:a
            匹配内容:1
            匹配内容:2
            匹配内容:4
            匹配内容:5
            匹配内容:6
            匹配内容:3
            匹配内容:b
            匹配内容:B
         */
//        // 第九组
//        Pattern pattern = Pattern.compile("\\W"); // 匹配除了数字、下划线、大小写字符
        /*
            匹配内容:
            匹配内容:@
         */
//        // 第十组
//        Pattern pattern = Pattern.compile("\\s"); // 匹配任何空白字符(空格,制表符等)
        /*
            匹配内容:
         */
//        // 第十一组
//        Pattern pattern = Pattern.compile("\\S"); // 匹配除了任何空白字符(空格,制表符等)
        /*
            匹配内容:_
            匹配内容:A
            匹配内容:a
            匹配内容:1
            匹配内容:2
            匹配内容:4
            匹配内容:5
            匹配内容:6
            匹配内容:3
            匹配内容:b
            匹配内容:B
            匹配内容:@
         */

        // 创建匹配器
        Matcher matcher = pattern.matcher(content);
        // 开始匹配
        while (matcher.find()){
            System.out.println("匹配内容:" + matcher.group(0));
        }
    }
}

选择匹配符: |

在匹配某个字符串的时候是选择性的,既可以匹配这个又可以匹配那个,应用:一次性匹配多个字符

举例:String regStr="d [a | b | c] "; // 匹配 da 或 db 或 dc

限定符

基本介绍

用于指定其前面的字符和组合项连续出现多少次

 *

指定字符重复 0 次或 n 次(0 到多)

举例:(abc)*--->匹配:abc、abcabc...

 +

指定字符重复 1 次或 n 次(1 到多)

举例:m + (abc)*--->匹配:m、mabc、mabcabc...

 ?

指定字符重复 0 次或 1 次(0 到 1),默认贪婪匹配,即尽可能匹配多的

举例:m + abc?--->匹配:mab、mabc、mabcabc...

{n}

指定列表中任意字符的匹配长度为 n

举例:[abcd]{3},由 abcd 中字母组成的任意长度为 3 的字符串,匹配:abc,dbc,adc

举例:a{3},匹配:aaa

{n,}

指定列表中匹配字符的长度至少为 n(≥ n)

举例:[abcd]{3,},匹配:abc,dbc,aaabdc...

{n,m}

指定列表中匹配字符的长度至少为 n(≥ n)个但不多于 m( ≤ m )个,默认贪婪匹配,即尽可能匹配多的

举例:[abcd]{3,5},匹配:abc,abcd、aaaaa、bcdab...

⭐ 非贪婪匹配

在限定符后加上问号

String content = "111hello",String regex = "\\d+?",这样就会匹配三个 1,而不是一次性匹配 111

代码示例

java
public class RegexDemo {
    public static void main(String[] args) {
        String content = "a211111aaaaahello";

        // 以下是各类正则表达式语法示例说明,实际使用时可按需替换 regStr 进行测试
        // a{3},1{4},\\d{2}
        // String regStr = "a{3}";// 表示匹配 aaa
        // String regStr = "1{4}";// 表示匹配 1111
        // String regStr = "\\d{2}";// 表示匹配 两位的任意数字字符

        // a{3,4},1{4,5},\\d{2,5}
        // 细节:java 匹配默认贪婪匹配,即尽可能匹配多的
        // String regStr = "a{3,4}";//表示匹配 aaa 或者 aaaa
        // String regStr = "1{4,5}";//表示匹配 1111 或者 11111
        // String regStr = "\\d{2,5}";//匹配 2 位数或者者 3,4,5

        // 1+
        // String regStr = "1+";//匹配一个 1 或者多个 1
        // String regStr = "\\d+";//匹配一个数字或者多个数字

        // 1*
        // String regStr = "1*";//匹配 0 个 1 或者多个 1

        // 演示?的使用,遵守贪婪匹配
        String regStr = "a1?"; // 匹配 a 或者 a1
        Pattern pattern = Pattern.compile(regStr);
        Matcher matcher = pattern.matcher(content);

        while (matcher.find()) {
            System.out.println("找到 " + matcher.group(0));
        }
    }
}

定位符

基本介绍

规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,这个也是相当有用的,必须掌握

符号含义示例说明匹配输入
^指定起始字符符号^[0-9]+[a-z]*以至少 1 个数字开头,后接任意个小写字母的字符串123, 6aa, 555edf
$指定结束字符符号[0-9]\-[a-z]+$以 1 个数字开头后接连字符“-”,并以至少 1 个小写字母结尾的字符串1-a
\b匹配目标字符串的边界han\b这里说明的字符串的边界指的是字符串前空格,或者是目标字符串的结束位置hanshuping spahan(空格) nnhan
\B匹配目标字符串的非边界han\B和\b 的含义刚刚相反hanshuping spahan nnhan

示例代码

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

public class Main {
    public static void main(String[] args) {
        // 测试字符串
        String content = "hanshuping sphan nnhan";
        // String content = "123-abc";

        // 正则表达式示例
        // 至少 1 个数字开头,后接任意个小写字母的字符串
        String regStr = "^[0-9]+[a-z]*";

        // 至少 1 个数字开头,必须至少一个小写字母结尾
        // String regStr = "^[0-9]+[a-z]-a-z$";

        // 表示匹配边界的 han[这边的边界是: 被匹配的字符串最后,
        // 也可以是空格的字符字符串的后面]
        // String regStr = "han\\b";

        // 和\b 的含义刚刚相反
        // String regStr = "han\\B";

        // 创建正则表达式模式对象
        Pattern pattern = Pattern.compile(regStr);

        // 创建匹配器对象
        Matcher matcher = pattern.matcher(content);

        // 查找并输出匹配的部分
        while (matcher.find()) {
            System.out.println("找到=" + matcher.group(0));
        }
    }
}

分组

捕获分组

常用分组构造形式说明
(...)非命名捕获。捕获匹配的子字符串。编号为零的捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据在括号内开始的编号。
(?<name>...)命名捕获。将匹配的子字符串捕获到一个组名称或编号中。用于 name 的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,如 (?‘name’)

命名分组:可以传入分组名获取内容,matcher.group("分组名")

代码示例

java
public class Main {
    public static void main(String[] args) {
        String regStr = "123abc456";
        // 使用 ?<> 命名
        Pattern compile = Pattern.compile("(?<group1>\\d\\d)(?<group2>\\d)");
        Matcher matcher = compile.matcher(regStr);
        while (matcher.find()){
            System.out.println("匹配内容:" + matcher.group());
            System.out.println("第一组:" + matcher.group("group1"));
            System.out.println("第二组:" + matcher.group("group2"));
        }
    }
}

输出结果

bash
匹配内容:123
第一组:12
第二组:3
匹配内容:456
第一组:45
第二组:6

非捕获分组

⚠️ 非捕获分组,没有分组,不可以写 matcher.group(1 / 2 / 3 /...)

查找内容

java
String regStr = "hello 韩顺平教育 jack 韩顺平老师 韩顺平同学hello韩顺平学生";

(?:pattern)

共有部分可以提取(匹配内容为表达式前面的字符),表示选择,符合条件的都选择

韩顺平(?:教育|老师|同学),匹配:韩顺平教育 、韩顺平老师、韩顺平同学的韩顺平

(?=pattern)

共有部分可以提取(匹配内容为表达式前面的字符),表示筛选,只查找符合等号后面的内容

韩顺平(?=教育|老师),匹配:韩顺平教育、韩顺平老师的韩顺平

(?!pattern)

共有部分可以提取(匹配内容为表达式前面的字符),表示取反

韩顺平(?!教育|老师),匹配:韩顺平同学、韩顺平学生的韩顺平