02月1日, 2023
文档+测试平台 : https://reg.coderead.cn/?u_dit=blili#/course/regex
在线工具 : https://c.runoob.com/front-end/854/
写在前面
RE让你解决相对复杂的问题,否则你需要用回溯代码编写完整的解析器以及所有那些混乱的东西。
学会使用re,就像学会了使用锯子去砍树。一旦你学会了如何安全地使用电锯,你将永远不会回去
但是哦,这不代表re就是万能,如果你对于任何问题都无脑的使用re,那么有时候这对问题的解决将毫无意义。
在我看来,完全拒绝它们是因为它们难以阅读.一个认为如此的开发人员剥夺了他自己搜索和验证复杂字符串模式的宝贵工具。
如果你渴望自己变得更强,更能处理复杂数据,那么re绝对值得学习
但是这一切的一切都是建立在你需要不断学习re,想要熟练,精通re绝不是一天两天的事,而且re的理解比较困难,需要各位坚持。
奥力给,干就完了,兄弟们!
什么是正则表达式
正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等
确定字符
/想要匹配的字符
/hello/m /m多行匹配
基本字符
\d 数字 digit \D 非数字
\w 单词 word \W 非单词
\s 空白 space \S 非空白
. 任意字符但是不包括换行
自定义范围
匹配时会存在一种情况就是只匹配单词,但是\w是包含\d的,因此涉及到一个操作叫做自定义范围
[abcdef] [a-f] [A-z]所有字母或者是[A-Za-z],可以进行组合
[A-z\d_] = \w
甚至可以[A-z\d_ \s]
^ 非 [^\d] = \D
注 [\n.]是否代表所有字符?
不是,因为当特殊字符放入[]中,就会失去它本身的意义。
这个要么匹配\n,要么匹配 . ,不能匹配这两个字符之外的任意字符。
特特殊字符被放入[ ]中是,匹配的就是这个特殊字符本身。
但若要实现这个特殊字符在中括号的作用就需要加转义符号了 \
( )括号
三个作用(建议按顺序学习)
1.子表达式
2.分组
3.边界断言
() 表示捕获分组,() 会把每个分组里的匹配的值保存起来, 多个匹配值可以通过数字 n 来查看(n 是一个数字,表示第 n 个捕获组的内容)。
{ }逻辑运算符
{数字} {区间} eg;{3} , {3,9}
\w{3} = \w\w\w
关于[ ]和( ) (注意)
[]的意思是匹配a,b,c,1,2,3中的任意一个字符。
而()的意思是匹配abc或者123。
()中的表达式将会优先执行。
特殊字符
所谓特殊字符,就是一些有特殊含义的字符.许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符”转义”,即,将反斜杠字符\ 放在它们前面。
Eg: ^
^once 表示该模式只匹配那些以 once 开头的字符串。例如该模式与字符串 “once upon a time” 匹配,与 “There once was a man from NewYork” 不匹配。
修饰符
正则原理之回退.*与.*?
一、模式不同
1、.*:.*为贪婪匹配模式。
2、.*?:.*?为最小匹配模式。
二、匹配条件不同
1、.*:.*的匹配条件为单个字符。
2、.*?:.*?的匹配条件为多个字符组成的字符串。
三、次数不同
1、.*:.*是满足条件的情况匹配任意次。用来匹配前面的子表达式任意次。
2、.*?:.*?是满足条件的情况只匹配用来匹配前面的子表达式零次或一次。
正则的匹配是一个一个匹配的, 先是匹配<span>
然后.*开始一直匹配到最后,但是到了最后是\n换行,也就说这个后面是匹配不到的
这时候是匹配不到</span>的,因此正则开始一个个回退,从最后一个字符一个一个回退
直到找到.*后面的 </ 才结束匹配
这个加了?会回退到第一个span,这是一个比.*更高性能的匹配,因为第一个.*是只要回退匹配成功就会停止
而.*?需要继续回退判断前方是否还有满足 要求的情况,来进一步进行匹配。