正则表达式(竞赛篇)

为了更深入了解正则表达式,我们需要首先学习与正则表达式有关的类以及方法。如Pattern和Matcher类,以及部分字符串方法。

我们这里先将简单的字符串方法(String类)进行讲解

在Java中,String类提供了许多用于字符串操作的方法,其中matches()、split()和replaceAll()等方法是非常有用的几个。这些方法在进行字符串匹配、分割和替换操作时非常高效。同时,Java也提供了Pattern和Matcher类,用于更复杂的正则表达式操作。

字符串方法

1.matches()方法

boolean matches(String regex):用于判断字符串是否与指定的正则表达式完全匹配。

代码示例:

java 复制代码
String str = "hello123";
boolean isMatch = str.matches("\\w+\\d+"); // 检查是否由字母和数字组成
System.out.println(isMatch); // 输出 true

2.split()方法

1.String[] split(String regex):根据匹配给定的正则表达式拆分字符串,返回一个字符串数组

代码示例:

java 复制代码
String str = "apple,banana,orange";
String[] fruits = str.split(",");
for (String fruit : fruits) {
    System.out.println(fruit);
}
// 输出:
// apple
// banana
// orange

2.String[] split(String regex,int limit):limit表示分割次数

代码示例:

java 复制代码
String str = "apple,banana,orange,grape";
String[] fruits = str.split(",", 3); // 最多分割成3部分
for (String fruit : fruits) {
    System.out.println(fruit);
}
// 输出:
// apple
// banana
// orange,grape

3.replaceAll()方法

String replaceAll(String regex,String replacement):使用给定的替换字符串替换与正则表达式匹配的部分

代码示例:

java 复制代码
String str = "The quick brown fox jumps over the lazy dog.";
String replacedStr = str.replaceAll("\\s+", "_"); // 将所有空白字符替换为下划线
System.out.println(replacedStr);
// 输出: The_quick_brown_fox_jumps_over_the_lazy_dog.

Pattern类和Matcher类是Java中用于处理正则表达式的两个核心类,它们位于java.util.regex包中。这两个类提供了对正则表达式的编译、匹配和查找操作的支持,使得Java程序能够灵活而强大地处理字符串匹配、替换等操作

Pattern

Pattern类是一个编译后的正则表达式表示为一个不可变的模式。它包含了正则表达式的编译表示以及匹配操作所需的匹配引擎。Pattern类没有公共构造器(即构造方法是private的),要创建一个Pattern对象,我们必须首先调用其公共静态编译方法,将指定的正则表达式编译成一个模式

主要方法

·Pattern compile(String regex):将给定的正则表达式 编译成一个模式
·Matcher matcher(CharSequence input):创建一个匹配器对象,用于对输入字符串进行匹配操作
·String pattern():返回此模式的正则表达式
·int flags():返回此模式的匹配标志

Matcher

Matcher类是对输入字符串进行解析和匹配操作的引擎。它与一个字符序列一起使用,对此序列执行匹配操作。通过调用Pattern对象的matcher方法获得一个Matcher对象,然后可以使用这个对象来进行各种匹配操作,如查找、替换等

主要方法

·boolean matches():尝试将整个区域与模式匹配
·boolean find():尝试查找与该模式匹配的下一个子序列
·boolean find(int start):重置此匹配器,然后尝试从指定索引处开始查找与该模式匹配的下一个子序列
·String group():返回由之前的匹配操作所匹配的输入子序列
·String replaceAll(String replacement):替换匹配此模式的输入序列的每个子序列
·String replaceFirst(String replacement):替换匹配此模式的输入序列的第一个子序列
·int start():返回当前匹配的起始索引
·int end():返回最后匹配字符之后的偏移量

正则表达式

定义:正则表达式是一种文本模式,用于描述在某个文本中所搜索的内容。它由字面值字符(普通字符)和特殊字符组成,可以用来匹配、替换和拆分字符串

用途:正则表达式在Java编程中广泛应用于字符串的模式匹配、替换、分割等操作,可以方便地应用于各种数据处理场景。

语法

·元字符:具有特殊含义的字符。 例如,'.'表示匹配任意字符; '*' 表示0或多个前面的字符; '+' 表示1或多个前面的字符; '?' 表示0或1个前面的字符

·特殊字符类:用于匹配非打印字符。例如, \s 表示空格字符; \n 表示换行字符; \d 表示数字字符; \D表示匹配除数字外的任意一个字符;\w 表示匹配任意一个字母、数字或下划线; \W 表示匹配除字母、数字和下划线外的任意一个字符

·字符类:用方括号 [ ] 表示,可以指定某个字符集中的任意一个字符。 例如,[abc]表示匹配a、b或c;[^abc]表示匹配除a、b、c以外的任意字符;[a-z]表示匹配a到z之间的任意一个小写字母

·边界匹配符:用于匹配文本的边界。例如, ^ 表示匹配文本的开头; $ 表示匹配文本的结尾

·捕获组:用括号 () 表示,可以将匹配到的字符保存在一个变量中,方便后续处理。group()方法用于返回在上一次匹配操作期间由给定组捕获的输入子序列

·限定符:用于指定匹配字符的数量。例如, {n} 表示匹配恰好n个字符; {n,} 表示匹配至少n个字符; {n,m} 表示匹配n到m个字符

·转义字符:用于正则表达式中的特殊字符。例如, \. 表示匹配点字符; \ 表示匹配斜杠字符

注意:Java中正则的转义需用\\ (如\\d表示数字)

总结

虽然String类中的正则表达式方法很方便,但对于更复杂的正则表达式操作,使用Pattern和Matcher类可以提供更多的灵活性和功能

·Pattern类:用于编译正则表达式(compile()方法),创建一个模式(Pattern)对象

·Matcher类:用于对输入字符串进行解释和匹配操作

String类中的matches()、split()和replaceAll()方法在内部实际上也是使用了Pattern和Matcher类来执行正则表达式的匹配和替换操作。这些方法是更高级别的封装,简化了常见的正则表达式操作

但是

Pattern和Matcher类提供了更强大的功能,比如:

·可以多次使用同一个编译过的正则表达式(Pattern对象),提高效率

·Matcher类提供了更多的方法,如find()、lookingAt()、matches()等,用于更复杂的匹配逻辑

·可以进行分组捕获(通过括号()在正则表达式中定义捕获组),并通过Matcher的group(int group)方法访问捕获的内容

简而言之,String类中的正则表达式方法适用于简单的场景,而Pattern和Matcher类则适用于更复杂和高效的正则表达式操作。

相关推荐
李斯维2 分钟前
循序渐进 Android Binder(一):IPC 基本概念和 AIDL 跨进程通信的简单实例
android·java·android studio
weixin_472339464 分钟前
StarRocks的几种表模型
java·服务器·前端
无名之逆5 分钟前
[特殊字符]Build High-Performance Web Services with Hyperlane
java·前端·java-ee·eclipse·tomcat·maven·visual studio
天天摸鱼的java工程师11 分钟前
Nginx 配置实战:从摸鱼到部署,手把手教你搞定生产级配置
java·后端·nginx
程序员清风13 分钟前
字节二面:Elasticsearch搜索,在搜索用到分词后,返回的第一条可能不是最匹配name的数据,这种如何解决?
java·后端·面试
yuren_xia15 分钟前
Spring Boot 自动参数校验
java·spring boot·后端
MarkHard12320 分钟前
JavaSE知识总结 ~个人笔记以及不断思考~持续更新
java·开发语言·笔记
think12336 分钟前
以后API的设计就按照这个标准来
java·后端·架构
Lester_110144 分钟前
嵌入式学习笔记 - freeRTOS在程序开始在任务内创建任务的好处是什么
java·开发语言·freertos
泽02021 小时前
C++之动态数组vector
java·开发语言·c++