iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java 正则表达式(深度长文)
  • 693
分享到

Java 正则表达式(深度长文)

正则表达式java 2023-09-22 16:09:11 693人浏览 独家记忆
摘要

目录 一.正则表达式 二.正则表达式的底层实现 1.matcher.find() 2.matcher.groups() 三.正则表达式的语法 1.正则转义符  2.正则表达式支持字符 3.捕获组(capture group) (1)普通捕获

目录

一.正则表达式

二.正则表达式的底层实现

1.matcher.find()

2.matcher.groups()

三.正则表达式的语法

1.正则转义符

 2.正则表达式支持字符

3.捕获组(capture group)

(1)普通捕获组

(2)命名捕获组

(3)补充:非捕获组

四.正则表达式的常见应用

1.验证字符串是否全是汉字

2.验证字符串是否是邮编

3.验证字符串是否是QQ号码

4.验证字符串是否是手机号码

5.验证字符串是否是url

五.正则表达式常用三个类

1.Pattern类

  matches()方法

2.Matcher类

(1)索引方法

(2)查找方法

(3)替换方法

3.PatternSyntaxException类

(1)public String getDescription()

(2)public int getIndex()

(3)public String getPattern()

(4)public String getMessage()

六.反向引用

1.分组

2.捕获

3.反向引用


(本文笔记整理思路来自韩顺平老师的Java正则表达式专题)

一.正则表达式

正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"),是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。

简单来说,正则表达式就是一个很牛逼的字符串处理工具




二.正则表达式的底层实现

 

1.matcher.find()

正则表达式中有()表示分组,第1个()表示第1组,第2个()表示第2组...

(1)根据指定的规则,定位满足规则的子字符串

(2)找到后,将子字符串的开始的索引记录到matcher对象的属性 int[] groups,把该子字符串的结束的索引的值+1记录到groups[1]中

a.groups[0]为子字符串开始的索引,groups[1]为该子字符串的结束的索引的值+1

b.groups[2]为匹配到的该字符串第1组的开始索引,groups[3]为匹配到的该字符串第1组的结束索引+1

c.groups[4]为匹配到的该字符串第2组的开始索引,groups[5]为匹配到的该字符串第2组的结束索引+1

依此类推……

(3)同时记录oldLast的值为该子字符串的结束的索引的值+1,即groups[1],即下次执行find时,就从groups[1]开始匹配

 

 (代码中参数含义不明白的,参考Java中的Matcher类



2.matcher.groups()

(1)matcher.groups(0)根据groups[0]和groups[1]记录的位置,从content开始截取字符串返回索引为[groups[0],groups[1])的位置,即返回匹配到的子字符串

(2)matcher.groups(1)返回匹配到的子字符串第1组的字符串,matcher.groups(2)返回匹配到的子字符串第2组的字符串,依此类推……

(3)如果你输入的group大于了分组数,会抛出IndexOutOfBoundsException异常




三.正则表达式的语法

1.正则转义符

元符号-转义号\\

\\符号说明:在我们使用正则表达式去检索某些特殊字符的时候,需要用到转义字符,否则检测不到结果,甚至会报错。

需要用到转义符的字符有:. * + ( )$ / \ ? [ ] ^ { }

注意:在Java的正则表达式中,两个\\代表其他语言中的一个\



 2.正则表达式支持字符

正则表达式所支持的合法字符
字符解释
X字符x(x 可代表任何合法的字符)
\0mnn八进制数 0mnn 所表示的字符
\xhh十六进制值 0xhh 所表示的字符
\uhhhh十六进制值 0xhhhh 所表示的 Unicode 字符
\t制表符(“\u0009”)
\n新行(换行)符(‘\u000A’)
\r回车符(‘\u000D’)
\f 换页符(‘\u000C’)
\a报警(bell)符(‘\u0007’)
\eEscape 符(‘\u001B’)
\cxx 对应的的控制符。例如,\cM匹配 Ctrl-M。x 值必须为 A~Z 或 a~z 之一。
正则表达式中的特殊字符
特殊字符说明
$匹配一行的结尾。要匹配 $ 字符本身,请使用\$
^匹配一行的开头。要匹配 ^ 字符本身,请使用\^
()标记子表达式的开始和结束位置。要匹配这些字符,请使用\(\)
[]用于确定中括号表达式的开始和结束位置。要匹配这些字符,请使用\[\]
{}用于标记前面子表达式的出现频度。要匹配这些字符,请使用\{\}
*指定前面子表达式可以出现零次或多次。要匹配 * 字符本身,请使用\*
+指定前面子表达式可以出现一次或多次。要匹配 + 字符本身,请使用\+
?指定前面子表达式可以出现零次或一次。要匹配 ?字符本身,请使用\?
.匹配除换行符\n之外的任何单字符。要匹配.字符本身,请使用\.
\用于转义下一个字符,或指定八进制、十六进制字符。如果需匹配\字符,请用\\
|指定两项之间任选一项。如果要匹配字符本身,请使用\|
预定义字符
预定义字符说明
.可以匹配任何字符
\d匹配 0~9 的所有数字
\D匹配非数字
\s匹配所有的空白字符,包括空格、制表符、回车符、换页符、换行符等
\S匹配所有的非空白字符
\w匹配所有的单词字符,包括 0~9 所有数字、26 个英文字母和下画线_
\W匹配所有的非单词字符

方括号表达式

方括号表达式 说明 表示枚举 例如 [abc]表示 a、b、c 其中任意一个字符; [gz]表示 g、z 其中任意一个字符 表示范围:- 例如 [a-f]表示 a~f 范围内的任意字符; [\\u0041-\\u0056]表示十六进制字符 \u0041 到 \u0056 范围的字符。范围可以和枚举结合使用,如 [a-cx-z],表示 a~c、x~z 范围内的任意字符 表示求否:^ 例如 [^abc]表示非 a、b、c 的任意字符; [^a-f]表示不是 a~f 范围内的任意字符 表示“与”运算:&& 例如  [a-z&&[def]]是 a~z 和 [def] 的交集,表示 d、e
f[a-z&&^bc]]是 a~z 范围内的所有字符,除 b 和 c 之外
[ad-z] [a-z&&[m-p]]是 a~z 范围内的所有字符,除 m~p 范围之外的字符 表示“并”运算 并运算与前面的枚举类似。例如 [a-d[m-p]]表示 [a-dm-p]

 边界匹配符

边界匹配符 说明 ^ 行的开头 $ 行的结尾 \b 单词的边界 \B 非单词的边界 \A 输入的开头 \G 前一个匹配的结尾 \Z 输入的结尾,仅用于最后的结束符 \z 输入的结尾
三种模式的数量表示符
贪婪模式勉强模式占用模式说明
X?X??X?+X表达式出现零次或一次
X*X*?X*+X表达式出现零次或多次
X+X+?X++X表达式出现一次或多次
X{n}X{n}?X{n}+X表达式出现 n 次
X{n,}X{n,}?X{n,}+X表达式最少出现 n 次
X{n,m}X{n,m}?X{n,m}+X表达式最少出现 n 次,最多出现 m 次

(如上几表来源于Java正则表达式详解

补充:

Java正则表达式默认是区分字母大小写的,如要实现不区分大小写

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

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

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

Pattern pattern=Pattern.compile(regStr,Pattern.CASE_INSENSITIVE); 

//当创建Pattern对象时,指定Pattern.CASE_INSENSITIVE,表示匹配不区分字母大小写

细节:Java匹配默认贪婪匹配,即尽可能匹配多的,比如"a{3,4}",表示匹配aaa或者aaaa,但是优先匹配aaaa,例如原字符串中包括"aaaaaa",匹配"a{3,4}"时,会找到"aaaa"



3.捕获组(capture group)

捕获组分为:普通捕获组和命名捕获组

(1)普通捕获组

从正则表达式左侧开始,每出现一个左括号"("记做一个分组,分组编号从 1 开始。0 代表整个表达式。常用分组构造形式(pattern)

对于时间字符串:2017-04-25,表达式如下

(\\d{4})-((\\d{2})-(\\d{2}))

有 4 个左括号,所以有 4 个分组:

编号捕获组匹配
0(\d{4})-((\d{2})-(\d{2}))2017-04-25
1(\d{4})2017
2((\d{2})-(\d{2}))04-25
3(\d{2})04
4(\d{2})25

(2)命名捕获组

每个以左括号开始的捕获组,都紧跟着 ?,而后才是正则表达式。

常用分组构造形式(?pattern)

注意:用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号代替尖括号,例如(?'name')

对于时间字符串:2017-04-25,表达式如下:

(?\\d{4})-(?(?\\d{2})-(?\\d{2}))

有 4 个命名的捕获组,分别是:

编号名称捕获组匹配
00(?\d{4})-(?(?\d{2})-(?\d{2}))2017-04-25
1year(?\d{4})-2017
2md(?(?\d{2})-(?\d{2}))04-25
3month(?\d{2})04
4date(?\d{2})25

命名的捕获组同样也可以使用编号获取相应值。


(3)补充:非捕获组

在左括号后紧跟 ?:,而后再加上正则表达式,构成非捕获组 (?:Expression)。

常用构造形式(?:pattern)

对于时间字符串:2017-04-25,表达式如下:

(?:\\d{4})-((\\d{2})-(\\d{2}))

这个正则表达式虽然有四个左括号,理论上有 4 个捕获组。但是第一组 (?:\d{4}),其实是被忽略的。当使用 matcher.group(4) 时,系统会报错。

编号捕获组匹配
0(\d{4})-((\d{2})-(\d{2}))2017-04-25
1((\d{2})-(\d{2}))04-25
2(\d{2})04
3(\d{2})25

(捕获组参考:Java正则表达式的捕获组(capture group)

(?=pattern)和(?!pattern)也是非捕获匹配,由于应用不多,就不介绍了,感兴趣的可以私下去了解




四.正则表达式的常见应用

1.验证字符串是否全是汉字

设置Pattern pattern=Pattern.compile("^[\u0391-\uffe5]+$");



2.验证字符串是否是邮编

设置Pattern pattern=Pattern.compile("^\\d{6}$");



3.验证字符串是否是QQ号码

设置Pattern pattern=Pattern.compile("^[1-9]d{4,9}$");



4.验证字符串是否是手机号码

(要求:必须以13,14,15,18开头的11位数)

设置Pattern pattern=Pattern.compile("^1[3|4|5|8]\\d{9}$");



5.验证字符串是否是url

设置Pattern pattern=Pattern.compile("^((Http|https)://)([\\w-]+\\.)+[\\w-]+(\\/[\\w-?=&/%.#]*)?$");




五.正则表达式常用三个类

1.Pattern类

pattern 对象是一个正则表达式的编译表示。Pattern 类没有公共构造方法。要创建一个 Pattern 对象,你必须首先调用其公共静态编译方法,它返回一个 Pattern 对象。该方法接受一个正则表达式作为它的第一个参数。

  matches()方法

 举个例子:



2.Matcher类

Matcher 对象是对输入字符串进行解释和匹配操作的引擎。与Pattern 类一样,Matcher 也没有公共构造方法。你需要调用 Pattern 对象的 matcher 方法来获得一个 Matcher 对象。

(1)索引方法

索引方法提供了有用的索引值,精确表明输入字符串中在哪能找到匹配:

序号方法及说明
1public int start()
返回以前匹配的初始索引。
2public int start(int group)
 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引
3public int end()
返回最后匹配字符之后的偏移量。
4public int end(int group)
返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。

举个例子: 

  

 注:substring()方法是前闭后开区间


(2)查找方法

查找方法用来检查输入字符串并返回一个布尔值,表示是否找到该模式:

序号方法及说明
1public boolean lookingAt()
 尝试将从区域开头开始的输入序列与该模式匹配。
2public boolean find()
尝试查找与该模式匹配的输入序列的下一个子序列。
3public boolean find(int start
重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
4public boolean matches()
尝试将整个区域与模式匹配。

 举个例子:

 

 

从上面例子显然能看到,当正则表达式是a*b时可以匹配,当正则表达式是ab时无法匹配,从而能证明matches()是完全匹配。

 


(3)替换方法

替换方法是替换输入字符串里文本的方法:

序号方法及说明
1public Matcher appendReplacement(StringBuffer sb, String replacement)
实现非终端添加和替换步骤。
2public StringBuffer appendTail(StringBuffer sb)
实现终端添加和替换步骤。
3public String replaceAll(String replacement)
 替换模式与给定替换字符串相匹配的输入序列的每个子序列。
4public String replaceFirst(String replacement)
 替换模式与给定替换字符串匹配的输入序列的第一个子序列。
5public static String quoteReplacement(String s)
返回指定字符串的字面替换字符串。这个方法返回一个字符串,就像传递给Matcher类的appendReplacement 方法一个字面字符串一样工作。

 

 

 

 

 

由quoteReplacement()的源码以及例子可以看出,quoteReplacement()用于将s转义,通过此方法生成的字符串s将在替换操作中被视为普通的字符串,即该方法转义了斜线'\'和美元符号'$'的特殊含义,使它们不再生效。



3.PatternSyntaxException类

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

PatternSyntaxException 类提供了下面的方法来帮助我们查看发生了什么错误。

(1)public String getDescription()

        获取错误的描述。

(2)public int getIndex()

         获取错误的索引。

(3)public String getPattern()

        获取错误的正则表达式模式。

(4)public String getMessage()

        返回多行字符串,包含语法错误及其索引的描述、错误的正则表达式模式和模式中错误索引的可视化指示。

举个例子:

 




六.反向引用

1.分组

我们可以用圆括号组成一个比较复杂的匹配模式,那么一个圆括号的部分我们可以看作是一个子表达式/一个分组。



2.捕获

把正则表达式中子表达式/分组匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。组0代表的是整个正则式。



3.反向引用

圆括号的内容被捕获后,可以在这个括号后被使用,从而写出一个比较实用的匹配模式,这个我们称为反向引用,这种引用既可以是在正则表达式内部,也可以是在正则表达式外部,内部反向引用\\分组号,外部反向引用$分组号。

例如:

(1)要匹配两个连续的相同数字:(\\d)\\1

(2)要匹配五个连续的相同数字:(\\d)\\1{4}

(3)要匹配个位与千位相同,十位与百位相同的数,例如1221,6556:(\\d)(\\d)\\2\\1

(4)结巴去重案例,例如要将"我我要学学学学编程!"简化成"我要学编程":

        content=Pattern.compile("(.)\\1+").matcher(content).replace("$1");

来源地址:https://blog.csdn.net/senxu_/article/details/126109760

--结束END--

本文标题: Java 正则表达式(深度长文)

本文链接: https://www.lsjlt.com/news/415520.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java 正则表达式(深度长文)
    目录 一.正则表达式 二.正则表达式的底层实现 1.matcher.find() 2.matcher.groups() 三.正则表达式的语法 1.正则转义符  2.正则表达式支持字符 3.捕获组(capture group) (1)普通捕获...
    99+
    2023-09-22
    正则表达式 java
  • java正则表达式
    目录 一、概念 二、正则表达式语法 三、捕获组 四、Pattern类与Matcher类 1.matches( ) 2.split( ) 3.find( ) 4.group 5.start( )和end( ) 6.replace替换 7.re...
    99+
    2023-09-21
    java 正则表达式
  • Java 正则表达式匹配
    1 正则表达式 1.1 什么是正则表达式 正则表达式: 定义一个搜索模式的字符串。 正则表达式可以用于搜索、编辑和操作文本。 正则对文本的分析或修改过程为:首先正则表达式应用的是文本字符串(text/string),它会以定义的模式从左到右...
    99+
    2023-10-27
    正则表达式 java 开发语言
  • 【JAVA】正则表达式是啥?
    个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 文章目录 前言正则表达式正则表达式语法正则表达式的特点捕获组实例 前言 如果我们想要判断给定的字符串是否符合正则表达式的过滤逻辑(称作“匹配...
    99+
    2023-08-16
    java 正则表达式 mysql
  • Java 正则表达式详解
    正则表达式(Regular Expression),又称为正规表达式、规则表达式、常规表示法等,是一种用来匹配、查找和替换字符串的工...
    99+
    2023-08-16
    Java
  • 正则表达式
    2019-01-16 作用 :     路由匹配,表单信息的验证  (字符串匹配) 信息提取(在大段文本中提取信息,爬虫) 字符串的提取和校验 []在中括号内匹配任意项  [^]不匹配中括号中的任意一项    [0-9]  0123......
    99+
    2023-01-30
    正则表达式
  • Java 之正则表达式语法及常用正则表达式汇总
    正则表达式概念: 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为 regex、regexp 或 RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表...
    99+
    2023-08-18
    正则表达式 java 开发语言
  • java正则表达式有哪些
    这篇文章主要为大家展示了“java正则表达式有哪些”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java正则表达式有哪些”这篇文章吧。 java正则表达式大全...
    99+
    2024-04-02
  • 基于Java的正则表达式
    正则表达式概念 正则表达式,又称正规表示法、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则...
    99+
    2023-05-31
    java 正则表达式 ava
  • 【Java 基础篇】Java 正则表达式
    文章目录 导言一、正则表达式的基本概念二、使用正则表达式的步骤三、示例代码1. 匹配字符串2. 提取匹配的内容3. 替换字符串 总结 导言 正则表达式是一种强大的文本模式匹配工具...
    99+
    2023-09-18
    java 正则表达式 python
  • python3-正则表达式
    import re print(re.search("xyx","qxyasdfxuyxyxaqd"))#寻找 print(re.match("xya","qxyasdfxuyxyxaqd"))#从头匹配,失败返回None print(re...
    99+
    2023-01-31
    正则表达式
  • Python3 正则表达式
    1.导入正则表达式模块 import re 2.匹配数字 print(re.findall('[0-9]','qwe21ewq')) 输出结果: 3.匹配字符 print(re.findall('[a-zA-Z]','abC')) 输出...
    99+
    2023-01-30
    正则表达式
  • Python_正则表达式
    正则表达式: 匹配字符串   re.compile():用于编译正则表达式,生成一个正则表达式对象,供 match() 和 search() 两个函数使用,一般建议使用这种编译方式 1 import re 2 str = 'abc1de...
    99+
    2023-01-30
    正则表达式
  • python正则表达式
    笔记:一:简介 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。 主要介绍Python中常用的正则表达式处理函数 提高工作效率,完成内置函数无法完成的任务! 搜索常用正则表达式!-...
    99+
    2023-01-30
    正则表达式 python
  • python 正则表达式
    正则表达式的作用:用来匹配字符串 一、字符串方法 字符串提供的方法是完全匹配,不能进行模糊匹配 s = 'hello world' # 字符串提供的方法是完全匹配,不能进行模糊匹配 print(s.find('ll')) # 2 ...
    99+
    2023-01-30
    正则表达式 python
  • qt 正则表达式
      以上是正则表达式的格式说明 以下是自己写的正则表达式  22-25行 是一种设置正则表达式的方式, 29-34行 : 29行 new一个正则表达式的过滤器对象 30行 正则表达式 的过滤格式 这个格式是0-321的任意数字都可以输入...
    99+
    2023-09-12
    qt
  • shell正则表达式
         Shell脚本扩展一 正确表达式正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。1. 支持的命令:grep、vim、fi...
    99+
    2024-04-02
  • Linux:正则表达式
    目录 一、grep和元字符         1.1、grep         1.2、元字符 二、正则匹配          2.1、查找特定的字符          2.2、使用[]来查找集合字符         要查找short和shi...
    99+
    2023-09-08
    正则表达式 java shell linux 服务器
  • PHP正则表达式
    什么是正则表达式? 正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文 正则表达...
    99+
    2023-09-02
    正则表达式 php 前端
  • 一文搞懂Java正则表达式的使用
    目录1.什么是正则表达式2.快速入门案例3.正则表达式语法转义符号字符匹配符字符匹配符演示选择匹配符正则限定符正则定位符1.什么是正则表达式 在了解正则表达式之前,我们先看几个非常常...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作