1.1什么是正则表达式
正则表达式是一种特殊的字符串模式,用于匹配一组字符串,就好比用模具做产品,正则就是这个模具,定义一种规则去匹配符合规则的字符
2.1元字符介绍
^:会匹配长或者字符串的起始位置,有事还会匹配整个文档的其实位置
$:匹配行或字符串的结尾
\b:不会消耗任何字符只配匹一个位置,常用于匹配单词边界 ex: this is regex 匹配 is \bis\b
\d:匹配数字
\w:匹配字母,数字,下划线
\s:匹配空格
.:匹配除了换行符以外的任何字符 \w的加强版
[]:字符组 匹配包含括号内元素的字符 ex1:[abc] ex2:[a-z]
2.2反义
\W: 匹配任意非字母,数字,下划线的字符
\S: 匹配任意非空格字符
\D:匹配任意非数字字符
\B:匹配不是单词开头或结束的位置
[^]:匹配非包含的元素字符 ex:[^abc] 匹配非abc的字符
2.3量词 用在元字符后
贪婪(贪心) 贪婪量词会首先匹配整个字符串,尝试匹配时,他会选定尽可能多的内容,如果失败则回退一个字符,然后再次尝试回退的过程就叫做回溯,它每次回回退一个字符,知道匹配的内容或者没有字符可以回退,相比下面两种贪婪量词对资源的消耗最大
懒惰(勉强) 懒惰量词从目标的起始位置开始尝试匹配,每次检查一个字符,寻找他要匹配的内容,如此循环到字符结尾
占有 量词会覆盖整个目标字符串,然后尝试寻找匹配内容,但他只尝试一次,不会回溯,就好比先抓一把石头,然后从石头里挑出黄金
*(贪婪)重复0次或更多 相当于{0,} ex:a*
+(占有)重复一次或更多 相当于{1,} ex:a+
?(懒惰)重复0零次或一次 相当于{0,1}
{n} 重复n次
{n,m} 重复n到m次
{n,} 重复n或更多次 ex:\d{2,}
2.4懒惰限定符
*?:重复任意次,但尽可能的少重复 ex:acbacb 正则a.*?b 只会取到acb
+?:重复一次或更多次,但尽可能的少重复
??:重复0次或一次,但尽可能的少重复
{n,m}?:重复n到m次,但尽可能的少重复
{n,}?:重复n次以上但尽可能的少重复
3.1捕获分组
括号内的内容为捕获分组,如(\d)\d (\d)就是一个捕获分组,可以对捕获分组进行后项引用(如果后面有相同的内容则可以直接引用前面定义的捕获组,以简化表达式)如(\d)\d\1这里的\1就是对(\d)的后向引用
ex:zery zery 正则\b(\w+)\b\s\1\b这里的\1多捕获的字符与(\w+)一样是zery,为了让组名更具意义,组名可以自定义名字
\b(?<name>\w+)\b\s\k<name>\b 用?<name>就可以定义组名了,\k<name>就可以反向引用了,自定义组名后,捕获组中匹配的值就会保存的定义的组里了
捕获组常用
(exp) 匹配exp,并捕获文本到自动命名的组里
(?<name>exp)匹配exp,并捕获文本到name组里
(?:exp)匹配exp,不捕获匹配的文本,也不分配组好。主要是用括号限制后面符号作用范围
(?=exp)匹配exp前面的位置
(?<=exp)匹配exp后面的位置
(?!exp)匹配后面跟的不是exp的位置 ex:1234abc \d{3}(?!\d) 234
(?<!exp)匹配前面不是exp的位置