魔芋:
01,小括号(又称为圆括号)会产生子表达式(又称为分组,子串)。能够在正则中\1,\2来引用子表达式匹配的文本值。
这些子表达式会被临时缓冲区缓存起来。
所捕获的每一个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。
缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每一个缓冲区均可以使用
'\n'
访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。如\1,\2。
n又称为分组号。
好处,能够不用重复查找某个匹配项。
这种方式,又称为反向引用。
这种又称为捕获分组。
02,用(?:n)能够消除小括号产生子表达式的效果。
03,
能够使用非捕获元字符 '?:'、'?=' 或 '?!' 来重写捕获,忽略对相关匹配的保存。
叫作:预测先行的匹配。
又叫作:非捕获组(non-capturing)
|
选择,匹配的是该符号左边的子表达式或右边的子表达式。
捕获
(exp)
用小圆括号进行分组,如日期中年月日的分组:/(\d{5})-(\d{1,2})-(\d{1,2})/
每一个分组将产生分组号,从第一个括号开始,能够使用\n的形式在正则中使用分组号。
如匹配成对出现的HTML标签,能够写成:/<(\w+)><\/\1>/。
能够记住和这个组合相匹配的字符串以供此后的引用使用。
(?:exp)
匹配exp正则,但不产生分组号,不记忆与该组匹配的字符
(?<name>exp)
匹配exp,并捕获文本到名称为name的组里,也能够写成(?'name'exp)
零宽断言:
exp1(?=exp2)
前瞻断言,匹配exp1,但后面必须是exp2。又称为
先行断言
。
零宽度正预测先行断言
如匹配名字叫xianlie,但不姓zhao的人:/zhao(?=xianlie)/
exp1(?!=exp2)
后瞻断言,匹配exp1,但后面不能是exp2。又称为
负向先行断言。先行否认断言。
如匹配姓zhao,但名字不叫xianlie的人:/zhao(?!xianlie)/
好比
\b\w+(?=ing\b)
,匹配
以ing结尾的单词的前面部分(除了ing之外的部分)
,如查找
I'm singing while you're dancing.
时,它会匹配
sing
和
danc
。
(?<exp)正则表达式
来自ES7。缓存
后行断言:与”先行断言”相反, x只有在y后面才匹配,必须写成/(?<=y)x/
。解释:找一个x,那个x的前面要有y。编码
又叫作:零宽度正回顾后发断言spa
好比(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re之外的部分),例如在查找reading a book时,它匹配ading。3d
(?<!exp)code
来自ES7。
后行否认断言: 与”先行否认断言“相反,x只有不在y后面才匹配,必须写成/(?<!y)x/
。 解释:找一个x,那个x的前面没有y。orm
能够看出,后行断言先匹配/(?<=y)x/的x,而后再回到左边,匹配y的部分,即先右后左”的执行顺序。blog
又叫作:
零宽度负预测先行断言
例如:
\d{3}(?!\d)
匹配
三位数字,并且这三位数字的后面不能是数字
;
\b((?!abc)\w)+\b
匹配
不包含连续字符串abc的单词
。
(?<![a-z])\d{7}
匹配
前面不是小写字母的七位数字
。
\n
和第n个分组第一次匹配的字符相匹配,组是圆括号的子表达式(也有多是嵌套的),组索引是从左到右的左括号数,“(?:形式的分组不编码