【Java】正则表达式详解

目录

引言

一、基本概念

[1.1 元字符](#1.1 元字符)

[1.2 预定义字符类](#1.2 预定义字符类)

[1.3 边界匹配符](#1.3 边界匹配符)

[1.4 数量标识符](#1.4 数量标识符)

[1.5 捕获与非捕获分组](#1.5 捕获与非捕获分组)

二、Java中的正则表达式支持

三、正则表达式的使用示例

[3.1 匹配字符串](#3.1 匹配字符串)

[3.2 替换字符串](#3.2 替换字符串)

[3.3 分割字符串](#3.3 分割字符串)

[3.4 使用Pattern和Matcher](#3.4 使用Pattern和Matcher)

[3.5 捕获组和后向引用](#3.5 捕获组和后向引用)

[3.6 贪婪模式和勉强模式的对比](#3.6 贪婪模式和勉强模式的对比)

四、正则表达式的进阶使用

结语


引言

正则表达式(Regular Expression)是计算机科学中的一个重要概念,它是一种强大的字符串处理工具,可以对字符串进行查找、提取、分割、替换等操作。正则表达式由普通字符(如a~z)和特殊字符(元字符)组成,用于描述在查找文字主体时待匹配的一个或多个字符串。在Java中,正则表达式通过java.util.regex包提供支持,主要包括Pattern和Matcher两个类,以及String类中的几个特殊方法。


一、基本概念

正则表达式是一个字符串,使用单个字符串来描述、用来定义匹配规则,匹配一系列符合某个句法规则的字符串。在开发中,正则表达式通常被用来检索、替换那些符合某个规则的文本。


1.1 元字符

表达式 含义
. 匹配任意单个字符(换行符除外)
\ 转义字符,用于匹配特殊字符或表示特殊序列
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
? 匹配前面的子表达式零次或一次
{n} 匹配前面的子表达式恰好n次
{n,} 匹配前面的子表达式至少n次
{n,m} 匹配前面的子表达式至少n次,但不超过m次
[] 字符类,匹配方括号中的任意字符
` `
() 分组,将多个字符或表达式组合成一个子表达式,用于后续引用或操作
(?i) 忽略后面字符的大小写

1.2 预定义字符类

表达式 含义
\d 匹配一个数字字符,等价于[0-9]
\D 匹配一个非数字字符,等价于[^\d]
\s 匹配任何空白字符,包括空格、制表符、换页符等,等价于[\t\n\r\f\v]
\S 匹配任何非空白字符,等价于[^\s]
\w 匹配任何单词字符(包括字母、数字和下划线),等价于[a-zA-Z0-9_]
\W 匹配任何非单词字符,等价于[^\w]

1.3 边界匹配符

表达式 含义
^ 匹配输入字符串的开始位置
$ 匹配输入字符串的结束位置
\b 匹配一个单词边界,即单词字符和非单词字符之间的位置
\B 匹配非单词边界

1.4 数量标识符

  • **贪婪模式(Greedy):**数量表示符默认采用贪婪模式,会一直匹配下去,直到无法匹配为止。
  • **勉强模式(Reluctant):**用问号后缀?表示,只会匹配最少的字符,也称为最小匹配模式。
  • **占有模式(Possessive):**用加号后缀+表示,目前只有Java支持占有模式,通常比较少用。

1.5 捕获与非捕获分组

捕获分组:

后续还要使用本组的数据

正则表达式内部使用:\\组号

正则表达式外部使用:$组好

非捕获分组:

符号 含义
(? : 正则) 获取所有
(? = 正则) 获取前面部分
(? ! 正则) 获取不是指定内容的前面部分

二、Java中的正则表达式支持

Java提供了多种方式来使用正则表达式,包括String类中的方法以及Pattern和Matcher类。

  1. String类中的方法
    • boolean matches(String regex):判断该字符串是否匹配指定的正则表达式。
    • String replaceAll(String regex, String replacement):将该字符串中所有匹配regex的子串替换成replacement。
    • String replaceFirst(String regex, String replacement):将该字符串中第一个匹配regex的子串替换成replacement。
    • String[] split(String regex):以regex作为分隔符,把该字符串分割成多个子串。
  2. Pattern和Matcher类
    • Pattern类:用于表示编译后的正则表达式。通过调用Pattern.compile(String regex)方法,可以将一个字符串形式的正则表达式编译成一个Pattern对象。
    • Matcher类:用于对输入字符串进行匹配操作。通过调用Pattern对象的matcher(CharSequence input)方法,可以创建一个Matcher对象,然后使用该对象进行匹配操作。

三、正则表达式的使用示例


3.1 匹配字符串

java 复制代码
String value = "12345";  
String regex = "\\d{5}";  
boolean matches = Pattern.matches(regex, value);  
System.out.println("The Result is: " + matches); // 输出: The Result is: true

3.2 替换字符串

java 复制代码
String s = "1324.5421";  
String s1 = s.replaceAll("[0-4]{4}\\.\\w{4}", "!");  
System.out.println(s1); // 输出: !

3.3 分割字符串

java 复制代码
String s = "1324.5421";  
String[] split = s.split("\\."); // 分割后数组为[1324, 5421]

3.4 使用Pattern和Matcher

java 复制代码
String value = "12345";  
String regex = "\\d{5}";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(value);  
System.out.println("The Result is: " + matcher.matches()); // 输出: The Result is: true

3.5 捕获组和后向引用

java 复制代码
String text = "go go";  
String regex = "\\b(\\w+)\\b\\s+\\1\\b";  
Pattern pattern = Pattern.compile(regex);  
Matcher matcher = pattern.matcher(text);  
while (matcher.find()) {  
    System.out.println("Found match: " + matcher.group()); // 输出: Found match: go go  
}

3.6 贪婪模式和勉强模式的对比

java 复制代码
String str = "hello,java!";  
// 贪婪模式的正则表达式  
System.out.println(str.replaceFirst("\\w*", "■")); // 输出: ■,java!  
// 勉强模式的正则表达式  
System.out.println(str.replaceFirst("\\w*?", "■")); // 输出: ■hello,java!

四、正则表达式的进阶使用

  1. 字符类中的范围和否定
    • [a-z]:匹配任意小写字母。
    • [A-Z]:匹配任意大写字母。
    • [0-9]:匹配任意数字。
    • [^a-z]:匹配任意非小写字母的字符。
  2. 分组和命名捕获组
    • (expression):将表达式分组,并捕获匹配的文本。
    • (?<name>expression):将表达式分组,并给捕获组命名。
  3. 零宽度断言
    • (?=exp):零宽度正预测先行断言,断言被匹配的字符串以表达式exp结尾,但不包括exp本身。
    • (?<=exp):零宽度正回顾后发断言,断言自身出现的位置前面能匹配表达式exp,但不包括exp本身。
  4. 条件表达式
    • (?(condition)yes-pattern|no-pattern):根据条件选择匹配yes-pattern或no-pattern。
  5. 正则表达式的选项
    • Pattern.CASE_INSENSITIVE:忽略大小写。
    • Pattern.MULTILINE:多行模式,使^$能够匹配输入字符串的每一行开头和结尾。
    • Pattern.DOTALL:点匹配所有字符,包括换行符。

结语

正则表达式是一种强大且灵活的字符串处理工具,在Java中得到了广泛的应用。通过掌握正则表达式的基本概念、元字符、预定义字符类、边界匹配符和数量标识符等知识点,以及Java中提供的String类方法和Pattern、Matcher类的使用方式,我们可以高效地处理各种字符串匹配、替换和分割等操作。同时,正则表达式的进阶使用技巧,如字符类中的范围和否定、分组和命名捕获组、零宽度断言和条件表达式等,也为我们提供了更强大的字符串处理能力。

相关推荐
蓝黑2020几秒前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深2 分钟前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
shuangrenlong14 分钟前
slice介绍slice查看器
java·ubuntu
牧竹子15 分钟前
对原jar包解压后修改原class文件后重新打包为jar
java·jar
数据小爬虫@25 分钟前
如何利用java爬虫获得淘宝商品评论
java·开发语言·爬虫
喜欢猪猪27 分钟前
面试题---深入源码理解MQ长轮询优化机制
java
醉陌离1 小时前
渗透测试笔记——shodan(4)
笔记
草莓base1 小时前
【手写一个spring】spring源码的简单实现--bean对象的创建
java·spring·rpc
LateBloomer7771 小时前
FreeRTOS——信号量
笔记·stm32·学习·freertos
legend_jz1 小时前
【Linux】线程控制
linux·服务器·开发语言·c++·笔记·学习·学习方法