前言
正则表达式就是一种规则或者说是模式,符合规则的字符串可以进行匹配。
一、总规则
总的来说就两部分组成,“/xxx/”-规则部分;“/xxx/Y”-Y为限制符部分;默认情况下,正则区分大小写。在输入字符串中找到符合正则表达式模式(规则)的实例叫做匹配。
例如:/[a-z0-9]/g,字符a-z,0-z,0-9字符都匹配,/g为全个字符串匹配。
二、几个常用的符号
1、^
1.1 ^在中括号内[^]代表非中括号的任意字符,即除中括号任意字符外的字符
eg:[^abc]即非a,非b,非c外的任意字符。
1.2 $表示以$前字符结尾的字符
2、 [] 表示中括号内的任意字符匹配
eg:[0-9a-z]即数字,字母全匹配;[abc]即abc任意字母都可匹配
3、 ()代表着一整个括号内字符串匹配;
eg:[^(yyy)abc] 即非yyy,非a,非b,非c都可匹配
4、 {}表示{}前的字符出现的范围次数或解析为符合{}前字符出现的{}内次数,{1}代表第一个符合的匹 配,{1,5}次代表符合的最多取前5次
eg:/[ab]{1,5}/g 即匹配到a或b,最多匹配前5个。
三、具体语法
1、/xxx/表示匹配里面的字符串;
例如:/pp/g ,即匹配字符串中所有符合pp小字符串
2、[xyz]字符组,表示里面任意一个字符;里面也可以用(xx)包装为字符串,所以匹配内任意字符或字符串
3、字符转义
字符转义是对某些通用字符类(譬如数字,纯大小写字母)等的简略表达
3.1 (1)数字字符-“\d”,即表示匹配0-9单字符,等同于[0-9];
eg:/\d/g = /[0-9]/g
(2)数字字符-“\D”,是“\d”的反面,相当于[^0-9]
eg:/\D/g = /[^0-9]/
三、系统学习
正则表达式主要用在如下场景:1.
输入验证;查找替换操作;高级字符串操作;文件搜索或重命名;白名单或黑名单。
正则表达式不适合用在如下场景:
XML或HTML解析;完全匹配的日期。
每种不同的语言都可以使用正则表达式,因为为不同的解析引擎,每种不同的解析引擎(语言)有点不一样,大多数共同情况下还是有共同的特征,教程以JS为学习。
一.基础
正则表达式的固定格式为/<rules>/<flags> ,即/规则/范围标志。
默认情况下,正则表达式区分大小写。
对输入的字符串找到的正则表达式模式(规则)的实例叫做“匹配”。
1.字符组
1.1/p/g,匹配字符串中所有的小写p字符。
eg:‘apple’-/p/g
1.2 /pp/g,匹配字符串中子字符串“pp”。
eg:'happy'-/pp/g
1.3/[abc]/g,匹配字符组,可以从一组字符中匹配任意一个字符。
eg:'appledao'-/[aeiou]/g
1.3.1 /[a-z]/g ,同为匹配字符组,也是一组字符中任意匹配一个实例,此为a到z简便写法
eg:'appledao'-/[a-z]/g ps:注意匹配为单个字符的实例,即使连续匹配都是多个实例,而不是一个字符串
1.3.2 /[A-Za-z0-9_]/g ,也是匹配字符组,为简便写法组合匹配组,
eg:'A P P l e ! 1 0 '-/[A-Za-z0-9_]/g
1.4/p[aeiou]t/g匹配规则字符串,从一组字符串中匹配任意符合规则的子字符串。
eg:'appatiopot'-/p[aeiou]t/g
1.5/[^aeiou]/g ,^代表否定,为非的意思,为非中括号内所有匹配的实例。
eg:'a p p ! l e s '-/[^aeiou]/g
2.转义字符
(转义有两种,一种是将普通字符特殊化,一种是特殊字符普通化)
字符转义是对某些通用字符类(组)的简略表达方式。字符转义变为转义字符。
2.1 \d为数字[0-9]转义字符,/\d/g = /[0-9]/g
eg:'apple 1 2'-/\d/g
2.2 \D为数字[^0-9]转义字符,/\D/g = /[^0-9]/g
eg:'a p p l e 1 2 '-/\D/g
2.3 \w为单词字符,为[a-zA-Z0-9_]的转义字符,/\w/ = /[a-zA-Z0-9_]/g
eg:'a p p l e _ 1 2 !'-/\w/g
2.4 \W为\w的反义,即为[^a-zA-Z0-9_]的转义字符,/\W/ = /[^a-zA-Z0-9_]/g
eg:'a p p l e _ 1 2 !'-/\W/g
2.5\s 为空白字符(间隔字符),为/['']/g等的转义字符,/\s/ = /[' ' ]/g
ps:根据引擎的不同而包括的范围不同,但至少包括空格,tab制表符\t,换行符\n,回车\r,换页\f
eg:'a p ple12'
2.6\S 为非空白字符
2.7.为任意字符,虽然不是典型的转义字符格式,但是也是转义字符,即为任意字符的转义字符,/./g = /任意字符/g
ps:虽然为任意字符,但其实换行符\n不包括,但是通过dotall修饰符,也可以匹配
eg:'ap12 p p l e'-/[a-z].\d/g
2.8.特殊字符转义,有些字符有特殊的含义,可以再在这些字符前面加\转义,达到字面上符号的意思
譬如:| + * . - ( )--------*代表所有的意思,+代表重复的意思={1,n},()为分组符,?为可选符={0,1},
eg:''(apple)" - /\(apple\)/g = /[(apple)]/g
3.组-()
3.1 ,
()在//里或[]里都可以使用,都是表示分组的概念,但是在//中使用,从功能上没有太多的作用,但是从语义上更清晰,或多组的意思.
在[]里使用,会让()降级,变成普通字符
eg:"(apple)"-/(apple)/g
eg:''abcdbcdefgbcde"-/a(bcde)+e/g
eg:'2020-08-01'-/(\d\d\d\d)-(\d\d)/g =/\d\d\d\d-\d\d/g
3.2 回溯
回溯意思是允许引用之前捕获的子字符组,必须是()包含起来的字符组,回溯第一组用\1,第二组用\2,以此类推,注意这不是对前一个模式的复制,是直接引用前一个模式匹配到的字符!
譬如 /([abc]\1(abc)\2/g-代表着先匹配的实例里第一个字符应该是【abc】中的一个,第二个就是回溯刚刚用()包起来的第一组匹配到的字符,第三组是abc,第四个也是匹配前面第二组用()来的组中的匹配项。
eg:'aaabcabc e f'- /([abc]\1(abc)\2/g
4.重复
4.1可选项
?代表着前面可选的意思,等同于{0,1},意思是0次或一次。
?也常用来贪婪模式或非贪婪模式的控制
eg:'a apple',' pple'-/^a?/g 以a开头,有或没有都可以匹配到
4.2重复0次或者多次
*代表着前面重复0次或多次,等同于{0,n}。
eg:'aaa pple'-/^a*/g
4.3重复1次或者多次
+代表着前面重复0次或多次,等同于{1,n}。
eg:'aa pple a'-/a+/g
4.4{n} 重复精确到n次
eg:'aa pple a'-/a{2}/g
4.5{min.max}重复最少,最多次
ps:注意如果是连续重复的次数超过规定的最多次,同时剩余的也符合最少,最多范围内,那么会自动分为两个匹配的实例。
eg:'aaa pp aaa aa le'-/a{2,3}/g
4.6{min,}重复最少次,最少次以上的次数的实例都能进行匹配
eg:'aa pple aaae a'-/a{2,}/g
4.7 正则表达式的贪婪模式与懒惰模式
正则表达式默认贪婪模式,会尽可能匹配符合条件的实例,譬如,/".*"/g,会匹配' "a"."b" '
当我们希望匹配所有符合条件的实例时,就需要使用懒惰模式,懒惰模式是遇到匹配的即会停止,在重复操作符后面添加?即可使用
/".*?"/g - ‘"a"."b"’
5.交替
5.1交替是匹配几个短语中的一个,[]字符组是匹配其中一个字符,交替匹配的是短语,即//内的内容
ps:正则表达式是从左到右尝试交替的,即会有短路的危险,所以一定要考虑清楚业务需求。
使用 | 管道符号,即代表交替的意思
eg:"foo a baz h"-/foo | baz/g
6.修饰符
修饰符允许我们把正则表达式分成不同的“模式”
不同的引擎有不同的修饰符,但常见都只有几种
6.1/g
全局匹配修饰符,意思为匹配整个字符串符合的实例;如果不加此修饰符,则默认只会匹配第一个符合的实例,即不会再向下匹配。
eg:'a pp l e'-/[aeiou]/g;'a pple'-/[aeiou]/
6.2 /i
不区分大小写修饰符,意思为不区分大小写
eg:'a pp l e'-/[aeiou]/gi;'apple'-/Aeiou]/g
6.3 /m
多行修饰符,用于匹配多行中符合规则的实例,只有在多行且是匹配多行中整一行,即以^$匹配时才有意义。
eg:'apple
abc' = 'apple/nabc'-/^abc$/
7.锚点
锚点本身不匹配任何东西,但是限制匹配出现的地方,其实就是一个标识符
7.1行首^
必须是出现在一行开始的地方,才符合规则
eg:'p andap' -'^p'/g
7.2行尾
必须是出现在一行结束的地方,才符合规则
eg:'panda p' -'p$'/g
7.3字边界锚点\b
字边界是字符(0-9,A-Z,a-z,_)与非词字符( ,+,-等)之间的位置,字边界锚点就是匹配到的字符与非词字符之间存在的假想不可见的字符
ps:每个字符串开头都有一个非词字符,此不可见
eg:'pan+pa'-/\bp/g
7.4非字边界锚点/B
就是符合的实例中去除字边界锚点后剩余的实例
eg:'pan+papa'-/\Bp/g
8.先行断言
先行断言用于验证条件是否符合,而不纯用来匹配 正向断言? =,负向断言 ?!。
/_(?=[aeiou])/g 意思即为后面是a\e\i\o\u中的其中一个的_,将会是符合规则的,也是被匹配到的。
eg:'e_e' -/_(?=[aeiou])/g
eg:'_f'-/_(?![aeiou])/g
ES6新增修饰符-y,-u