正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图

简介: 正则表达式源码分析--三个常用类--分组、捕获、反向引用--String 类中使用正则表达式的代码示例和图

正则表达式

底层实现

matcher.find() 完成的任务 (考虑分组)


什么是分组,比如 (\d\d)(\d\d) ,正则表达式中有() 表示分组,


第 1 个()表示第 1 组,        第 2 个()表示第 2 组...

1. 根据指定的规则 ,定位满足规则的子字符串(比如(19)(98))


2. 找到后,将 子字符串的开始的索引记录到 matcher 对象的属性 int[] groups;


       2.1 groups[0] = 0 , 把该子字符串的结束的索引+1 的值记录到 groups[1] = 4

       2.2 记录 1 组()匹配到的字符串 groups[2] = 0 groups[3] = 2

       2.3 记录 2 组()匹配到的字符串 groups[4] = 2 groups[5] = 4

       2.4.如果有更多的分组..... *

3. 同时记录 oldLast 的值为 子字符串的结束的 索引+1 的值即 35, 即下次执行 find 时,


就从 35 开始匹配


matcher.group(0) 分析

源码:

public String group(int group) {

if (first < 0)

throw new IllegalStateException("No match found");

if (group < 0 || group > groupCount())

throw new IndexOutOfBoundsException("No group " + group);

if ((groups[group*2] == -1) || (groups[group*2+1] == -1))

return null;

return getSubSequence(groups[group * 2], groups[group * 2 + 1]).toString();* }

4. 根据 groups[0]=31 和 groups[1]=35 的记录的位置,从 content 开始截取子字符串返回


就是 [31,35) 包含 31 但是不包含索引为 35 的位置


如果再次指向 find 方法.仍然安上面分析来执行

正则表达式语法

如果要想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为:              

1、                       1.限定符

1、                       2.选择匹配符

1、                       3.分组组合和反向引用符

1、                       4.特殊字符

1、                       5.字符匹配符

1、                       6.定位符


元字符(Metacharacter)-转义号


\\符号说明:在我们使用正则表达式去检索某些特殊字符的时候,


需要用到转义符号,否则检索不到结果,甚至会报错的。


提示:

在Java的正则表达式中,两个\\代表

其他语言中的一个


元字符-字符匹配符

元字符-选择匹配符

在匹配某个字符串的时候是选择性的,


即:既可以匹配这个,又可以匹配那个,这时你需要用到选择匹配符号


元字符-限定符


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


元字符-定位符


定位符, 规定要匹配的字符串出现的位置,比如在字符串的开始还是在结束的位置,


分组

正则表达式三个常用类

java.util.regex 包主要包括以下三个类 Pattern类、 Matcher类和     PatternSyntaxException

Pattern类


pattern对象是一个正则表达式对象。Pattern类没有公共构造方法。


要创建一个Pattern对象,调用其公共静态方法,它返回一个Pattern对象。


该方法接受一个正则表达式作为它的第一个参数,比如:Pattern r=Pattern.compile(pattern);

Matcher


Matcher对象是对输入字符串进行解释和匹配的引擎。


与Pattern类一样,Matcher也没有公共构造方法。


你需要调用 Pattern对象的 matcher方法来获得一个 Matcher对象

PatternSyntaxException


是一个非强制异常类 它表示一个正则表达式模式中的语法错误

分组、捕获、反向引用

分组

分组(\d\\d)(\d\d)


我们可以用圆括号组成一个比较复杂的匹配模式,


那么一个圆括号的部分我们可以看作是一个子表达式/一个分组。

捕获


把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,


方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,


第二个为2,以此类推。组0代表的是整个正则式

反向引用


圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,


这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,


内部反向引用\\分组号,外部反向引用$分组号

String 类中使用正则表达式

替换功能

StringReg.java

String 类 public String replaceAll(String regex,String replacement)

判断功能

String 类 public boolean matches(String regex){} //使用 Pattern 和 Matcher 类

分割功能

String 类 public String[] split(String regex)


本章笔记是观看韩顺平的JAVA的视频和在网上找的资料 以及自己的理解总结出来的笔记希望可以帮助大家,感谢大家的耐心观看 如有错误请即使联系我 我会及时修正


目录
相关文章
|
4月前
|
编解码 Java 开发者
Java String类的关键方法总结
以上总结了Java `String` 类最常见和重要功能性方法。每种操作都对应着日常编程任务,并且理解每种操作如何影响及处理 `Strings` 对于任何使用 Java 的开发者来说都至关重要。
349 5
|
12月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
8月前
|
存储 编译器 C语言
关于string的‘\0‘与string,vector构造特点,反迭代器与迭代器类等的讨论
你真的了解string的'\0'么?你知道创建一个string a("abcddddddddddddddddddddddddd", 16);这样的string对象要创建多少个对象么?你知道string与vector进行扩容时进行了怎么的操作么?你知道怎么求Vector 最大 最小值 索引 位置么?
207 0
|
11月前
|
缓存 安全 Java
《从头开始学java,一天一个知识点》之:字符串处理:String类的核心API
🌱 **《字符串处理:String类的核心API》一分钟速通!** 本文快速介绍Java中String类的3个高频API:`substring`、`indexOf`和`split`,并通过代码示例展示其用法。重点提示:`substring`的结束索引不包含该位置,`split`支持正则表达式。进一步探讨了String不可变性的高效设计原理及企业级编码规范,如避免使用`new String()`、拼接时使用`StringBuilder`等。最后通过互动解密游戏帮助读者巩固知识。 (上一篇:《多维数组与常见操作》 | 下一篇预告:《输入与输出:Scanner与System类》)
307 11
|
11月前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、&quot;+&quot;操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
334 9
|
11月前
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
211 1
|
12月前
|
人工智能 算法 Ubuntu
动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
动态规划篇】正则表达式与通配符:开启代码匹配的赛博奇幻之旅
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
323 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
511 6
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
446 2