Java学习之正则表达式-2021-09-02~5

正则表达式

1.正则表达式入门简介、使用…

正则表达式的使用场景

  • 批量提取/替换有规律的字符串
  • 在各种高级的文本编辑器中的使用
  • 在各类办公软件( Office等)中使用
  • 各开发语言中iR ( C#/ Java / JS / Perl/ PHP 等等)
  • 用户输入的合法性验证(IP地址,特殊的订单号要求等)
  • 模板引擎的标签库开发
  • 网络爬虫(抓取机器人)的开发
  • 批量的文本高效处理

正则表达式的测试工具

  • 推荐RegexBuddy

    http://www.regexbuddy.com

  • RegExBuilder

    http://www.redfernplace.com/software-projects/regex-builder/

  • 在线测试工具

    http://tool.chinaz.com/regex/

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bYzsaIDX-1630830759957)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210901164135414.png)]

2.初识正则表达式以及元字符概念

Agenda

  • Windows系统命令行中存在的最简单的正则表达式
  • 元字符概念以及元字符的反义
  • 转义的概念以及正则表达式中的使用正
  • 则表达式语言中的注释方法

Windows系统命令行中存在的最简单的正则表达式

  • *任意长度的字符串
  • ?长度为1的任意字符串

元字符概念

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rv5wLU7Z-1630830759959)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210901164550540.png)]

使用操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARrln2lV-1630830759960)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210901164839923.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wSGuXDes-1630830759962)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210901165115372.png)]

元字符的反义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4lcqysIQ-1630830759966)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210901165548514.png)]

字符转义

  • 如果就是想要匹配.或者?这样的字符呢?
  • 转义字符\
\. \*  \?  

正则表达式中的注释

  1. ​ 2[0-41\d(?#200-249)250-5[01]?\d\d?(?#0-199).

  2. 启用“忽略模式里的空白符”选项

(?<=	#断言要匹配的文本的前缀

<(w+)> 	#查找尖括号括起来的字母或数字(即HTML/XML标签)

)	#前缀结束

.* 	 #匹配任意文本

(?= 	#断言要匹配的文本的后缀

<V\1>	 #查找尖括号括起来的内容:前面是一个"/" ,后面是先前捕获的标签

) 	#后缀结束 

3.正则表达式中的重复

Agenda

  • 分支条件
  • 正则表达式中的几种重复模式
  • 重点解释重复的几种模式的区别
  • 讲解正则表达式中重复的使用场景

正则表达式中的几种重复模式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w1SvaI66-1630830759967)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210901174454383.png)]

分支条件

  • 用|不同的规则分隔开
  • 从左到右地测试每个条件,如果满足了某个分枝的话,就不会去再管其它的件了
  • 0\d{2}-\d{8}|0\d{3}-\d{7}

字符类

  • [0-9] ==\d

  • [a-z0-9A-Z_] ==\w

  • [&?.]

  • [aeiou]

  •  \(?0\d{2}[)-}?\d{8} 
    

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xe9O2NoE-1630830759968)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210901175720387.png)]

4.正则表达式中的分组概念&贪婪与懒情

Agenda

  • 讲解正则表达式中重要的一个概念:命组
  • 分组的概念
  • 分组的命名模式分
  • 组的用途
  • 正则表达式中的贪婪和懒惰

分组

  • 将子表达式进行做成子集

  • 使()进分组

  • 方便对match的字符串进行划分

    (\d{1,3}\.){3}\d{1,3}
    
  • 分组的命名: (? exp)

  • (?:exp) 匹配exp不捕描获匹配的文本,也不给此分组分配组号

贪婪与懒情

  • 贪婪(尽可能多)

    a.*b (aabab) -> aabab

  • 懒惰(尽可能少)

    匹配任意数量的重复,但是在能使整个匹配成功的前提下使用最少的重复a.*?b (aabab)-> aab

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5oWRgvVQ-1630830759969)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210902174705877.png)]

处理选项(RegexOptions)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BOEhcp4a-1630830759970)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210902174735546.png)]

5.正则表达式高阶讲解

Agenda

  • 反向引用
  • 零宽断言的概念以及使用场景
  • 负向零宽断言的概念以及使用场景
  • 冗长的平衡组和递归匹配

反向引用

  • 要匹配taobao taobao , home home这样的情况如果处理?
  • \b(\w+)\b\s+\1\b
  • \b(? \w+)\b\s+\k\b这是命名后的另一种写法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sF7AnLhr-1630830759971)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210905153950280.png)]

零宽断言

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hComM4se-1630830759972)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210905154811249.png)]

  • ?=exp零宽度正预测先行断言,自身出现的位置的后面能匹配表达式exp

  • \b\w+(?=ing\b)

  • I’m sing ing while you’re dancing.

  • ?<=exp零宽度正回顾后发断言,自身出现的位置的前面能匹配表达式exp

    (?<=\bre)w+\b

    reading a book

负向零宽断言

  • 查找这样的单词-它里面出现了字母q,但是q后面跟的不是字母u

    	\b\w*q[^uJw*\b
    
    • 上面的表达式有没有问题呢?使用零宽度负预测先行断言
  \b\w*q(?!u)\w*\b 

并不消费任何字符

  • \d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字

  • \b((?!abc)w)+\b匹配不包含连续字符串abc的单词

  • 那么同样的,还有零宽度负回顾后发断言

    • (? <![a-z)d{7)匹配前面不是小写字母的七位数字
    • (?<=<(w+)>).*(?=)不包括前缀和后缀本身

平衡组/递归匹配

  • 如何把xx <aa aa> yy这样的字符串里,最长的配对的尖括号内的内容捕获出来?
  • (?‘group’)把捕获的内容命名为group,并压入堆栈(Stack)
  • (?"-group’)从堆栈上弹出最后压入堆栈的名为group的捕获内容,如果堆栈本来为空,则本分组的匹配失败
  • (?(group)yesIno)如果堆栈上存在以名为group的捕获内容的话,继续匹Eyes部分的表达式,否则继续匹配no部分
  • (?!)零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ukxlxnmK-1630830759973)(C:\Users\十九婊哥\AppData\Roaming\Typora\typora-user-images\image-20210905160324552.png)]

总结


  • 多进行实际的实例

  • 想学好多练习

  • 学好后一劳永逸,威力无穷

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 正则表达式是用来匹配字符串模式的工具,其中限定修饰符是指用来限制模式匹配次数的特殊字符。在Java中,正则表达式的限定修饰符包括: 1. *:表示匹配前面的元素0次或多次。 2. +:表示匹配前面的元素1次或多次。 3. ?:表示匹配前面的元素0次或1次。 4. {n}:表示匹配前面的元素恰好n次。 5. {n,}:表示匹配前面的元素至少n次。 6. {n,m}:表示匹配前面的元素至少n次,但不超过m次。 例如,如果我们要匹配一个字符串,使其以字母a开头,后面跟着0个或多个字母b,那么我们可以使用正则表达式:a*b*。 另外需要注意的是,这些限定修饰符默认是“贪婪”的,也就是尽可能多地匹配符合条件的字符串。如果需要改为“懒惰”模式,可以在修饰符后面加上“?”,例如:*?、+?、??、{n}?、{n,}?、{n,m}?。 ### 回答2: Java正则表达式的限定修饰符在匹配字符串时可以表示某个字符出现的次数或位置的限定条件,它们是一种非常强大的功能。 常见的限定修饰符有: 1. \* :匹配零次或多次出现的前面的字符,例如 "zo*"可以匹配 "z"和 "zoo"。 2. + :匹配一次或多次出现的前面的字符,例如 "zo+"可以匹配 "zo"和 "zoo",但不能匹配 "z"。 3. ? :匹配零次或一次出现的前面的字符,例如 "do(es)?"可以匹配 "does"和 "doesnot"。 除此之外,还有一些比较特殊的限定修饰符,如: 1. {n} :匹配前面的字符恰好出现 n次,例如 "zo{2}"可以匹配 "zoo",但不能匹配 "zo"或 "zoatt"。 2. {n,} :匹配前面的字符至少出现 n次,例如 "zo{2,}"可以匹配 "zoo"和 "zoatt",但不会匹配 "z"。 3. {n,m} :匹配前面的字符至少出现 n次,但不超过 m次,例如 "zo{1,2}"可以匹配 "zo"和 "zoo",但不会匹配 "z"或 "zoatt"。 除了以上三个,还可以通过同时使用多个限定修饰符来匹配不同的字符串,如: 1. "zo*"可以匹配 "z","zo","zoo"等等。 2. "zo{2,3}"可以匹配 "zoo"和 "zooa",但不能匹配 "zo"或 "zoatt"。 正则表达式的限定修饰符可以让你更加灵活地匹配需要的字符串,它是Java字符串处理中非常重要的一部分,掌握好这些知识可以大大提升你对字符串的处理能力。 ### 回答3: 正则表达式是我们经常使用的一种工具,可以通过表达式匹配对应的文本或字符集。在Java中,字符串也支持正则表达式的应用,可以利用正则表达式对字符串进行匹配、替换、分割等操作。正则表达式的限定修饰符则是正则表达式的一种语法,用来指定正则表达式匹配的数量或范围。 正则表达式的限定修饰符有以下几种: 1. *(星号):表示匹配前面的字符出现0次或多次。 例如:正则表达式“a*b”可以匹配到“b”、“ab”、“aab”、“aaab”等字符串。 2. +(加号):表示匹配前面的字符出现1次或多次。 例如:正则表达式“a+b”可以匹配到“ab”、“aab”、“aaab”等字符串,但不能匹配到“b”这样的字符串。 3. ?(问号):表示匹配前面的字符出现0次或1次。 例如:正则表达式“a?b”可以匹配到“b”、“ab”这样的字符串。 4. {n}:表示匹配前面的字符刚好出现n次。 例如:正则表达式“a{2}b”可以匹配到“aab”这样的字符串。 5. {n,}:表示匹配前面的字符至少出现n次。 例如:正则表达式“a{2,}b”可以匹配到“aab”、“aaab”等字符串。 6. {n,m}:表示匹配前面的字符出现n到m次。 例如:正则表达式“a{2,4}b”可以匹配到“aab”、“aaab”、“aaaab”这样的字符串。 除了以上几种限定修饰符外,还可以使用“|”(或)符号来匹配多个选择,使用“()”来对正则表达式进行分组。 在Java中,可以利用String类中的matches()方法来进行正则表达式的匹配。matches()方法接收一个正则表达式作为参数,如果字符串符合该正则表达式,则返回true;否则返回false。例如: String str = "abc123"; boolean result = str.matches("[a-z]{3}[0-9]{3}"); // result会被赋值为true,因为str符合正则表达式[a-z]{3}[0-9]{3} 正则表达式的限定修饰符是正则表达式的重要组成部分,掌握了限定修饰符,就能更好地利用正则表达式进行字符串的处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值