Java 正则表达式

本文详细介绍了Java中正则表达式的语法,包括字符、量词、边界匹配、群组和标志的使用,并通过实例展示了如何匹配、分割和替换字符串。
摘要由CSDN通过智能技术生成

1、语法概述

参考 Java 核心技术:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2、基本语法

2.1 字符

[ABC]:匹配 A | B | C

[^ABC]:不匹配 A | B | C

[A-Z]:匹配 A - Z

.:匹配除换行符之外的任何字符,等价于[^\n\r],如果设置了s标志,则表示任何字符

\s:匹配空白字符

\S:匹配非空白字符

\w:匹配字母、数字和下划线,等价于[A-Za-Z0-9_]

注意,匹配特殊字符需要进行转义。

2.2 量词

{n}:匹配 n 次

{n,}:最少匹配 n 次

{n,m}:最少匹配 n 次,最多匹配 m 次

*:匹配零次或多次,等价于{0,}

+:匹配一次或多次,等价于{1,}

?:匹配零次或一次,等价于{0,1}

*+都是贪婪匹配的,可以在它们后面加上?,实现最小匹配:

public class Main {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile(".*e");
        Matcher matcher = pattern.matcher("Regular Expression");
        while(matcher.find()) {
            System.out.println(matcher.group(0));
        }
        System.out.println("----------");
        pattern = Pattern.compile(".*?e");
        matcher = pattern.matcher("Regular Expression");
        while(matcher.find()) {
            System.out.println(matcher.group(0));
        }
    }
}

运行结果:

Regular Expre
----------
Re
gular Expre

2.3 边界匹配

^:匹配字符串的开始位置,如果设置了m标志,将匹配每行的开始位置

$:匹配字符串的结束位置,如果设置了m标志,将匹配每行的结束位置

\b:匹配单词的边界,放在字符之前表示匹配单词开头,反之匹配单词结尾

\B:匹配非单词边界,即单词内部

2.4 群组

(X):捕获 X 的匹配

\n:第 n 组

(?<name>X):捕获与给定名字匹配的 X

\k<name>:具有给定名字的组

(?:X):使用括号但是不捕获 X

2.5 标志

i:匹配时不区分大小写

m:多行匹配,使定位符^$匹配每行的开头和结尾

s:使符号.匹配的字符包含换行符

3、匹配字符串

要求字符串全部匹配时,使用matcher.matches()判断:

public class Main {
    public static void main(String[] args) {
        // 将给定的正则表达式编译为模式
        Pattern pattern = Pattern.compile("(([1-9]|1[0-2]):([0-5][0-9]))[ap]m"
                , Pattern.CASE_INSENSITIVE);
        // 创建一个将根据此模式匹配给定输入的匹配器
        Matcher matcher = pattern.matcher("11:59AM");
        // 是否全部匹配
        if(matcher.matches()) {
            // 获取第一个匹配字符的偏移量
            int start = matcher.start();
            // 获取最后一个匹配字符之后的偏移量
            int end = matcher.end();
            System.out.println(start + " " + end);
            // 返回捕获的群组数量
            int count = matcher.groupCount();
            for(int i = 0; i <= count; i++) {
                // 输出捕获的群组
                System.out.print(matcher.group(i) + " ");
            }
        }
    }
}

运行结果:

0 7
11:59AM 11:59 11 59 

获取匹配的子字符串时,使用matcher.find()

public class Main {
    public static void main(String[] args) {
        // 将给定的正则表达式编译为模式
        Pattern pattern = Pattern.compile("(([1-9]|1[0-2]):([0-5][0-9]))[ap]m"
                , Pattern.CASE_INSENSITIVE);
        // 创建一个将根据此模式匹配给定输入的匹配器
        Matcher matcher = pattern.matcher("--11:59am--5:30PM--");
        // 查找部分匹配
        while (matcher.find()) {
            // 获取第一个匹配字符的偏移量
            int start = matcher.start();
            // 获取最后一个匹配字符之后的偏移量
            int end = matcher.end();
            System.out.print(start + " " + end + " ");
            // 输出匹配的字符串
            System.out.println(matcher.group(0));
        }
    }
}

运行结果:

2 9 11:59am
11 17 5:30PM

4、分割字符串

示例代码:

public class Main {
    public static void main(String[] args) {
        String str = "1, 2,  3 ,4 , 5";
        String[] split = str.split("\\s*,\\s*");
        System.out.println(Arrays.toString(split));
    }
}

运行结果:

[1, 2, 3, 4, 5]

5、替换字符串

示例代码:

public class Main {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile("[0-9]+");
        Matcher matcher = pattern.matcher("192.168.167.14");
        String result = matcher.replaceAll("#");
        System.out.println(result);
    }
}

运行结果:

#.#.#.#

如有错误,欢迎指正。.... .- ...- . .- -. .. -.-. . -.. .- -.-- -.-.--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值