1.正则表达式简介
知乎专栏:
正则表达式 工具:强于上面的可视化工具,详细解释每个字符和匹配的过程
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。
正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。
2.正则表达式语法
-
普通字符:大小写字母,数字、标点符号
-
元字符:( [ { \ ^ $ | ? * + . 小中大括号,反斜杠,阶数符号、美元符,或符号,问号,乘 ,加,点 ,元字符必须转义才会被视为检索对象
-
限定符:
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有 ***** 或 + 或 ? 或 {n} 或 {n,} 或 {n,m} 共6种。
*、+限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
-
乘号* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 * ,例:
runoo*b,可以匹配 runob、runoob、runoooooob 等,* 号代表字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)。
-
加号 + 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +,例:
runoo+b,可以匹配 runoob、runooob、runoooooob 等,+ 号代表前面的字符必须至少出现一次(1次或多次)。
-
问号 ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。例:
匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 、 "does" 中的 "does" 、 "doxy" 中的 "do" 。? 等价于 {0,1}。
-
{n} :n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
-
{n,}:n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
-
{n,m}:m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
-
^ 放在/[ ^abc]/是排除的意思,不放在中括号里面,是从字符串左边第一个字符开始匹配的意思 是 正 则 表 达 式 匹 配 字 符 串 结 束 位 置 。 使 用 了 , 不 会 从 字 符 串 中 间 开 始 匹 配 , 使 用 了 是正则表达式匹配字符串结束位置。使用了^,不会从字符串中间开始匹配,使用了 是正则表达式匹配字符串结束位置。使用了,不会从字符串中间开始匹配,使用了,即使匹配了,结束位置不在字符串结尾,也不算匹配
3.正则表达式容易出错的点
-
\w 包括下划线,完全等效于[0-9a-zA-Z_]
-
\b是单词边界的意思
-
/(?=\d{3} ) / g 这 里 的 )/g 这里的 )/g这里的的意思是从后往前数,\d{3}是匹配三个数字
-
/(?!^)(?=(\d{3})+$)/g 后面是:从后往前数,每三个数字匹配一次,至少匹配一次,前面是:不能是开头对应的字符的前面一个空格位置
-
[\d\D]、[\w\W]、[\s\S]和[^]都可以实现匹配任意字符
-
正向肯定预查 (?=pattern)只有正向预查到了pattern的模式,才开始从pattern之前一个假想的空格处开始匹配查找
/(?=.*[0-9])1{6,12}$/ (?=[0-9])是第一个数字的前面的假想空格,如 hasj|458jh6 4的前面那里的位置
(?=.*[0-9]) 数字前面可以有0-n个任意字符,因此位置到了h的前面
所以/(?=.*[0-9])(?=.*[a-z])2{6,12}$/; 功能:要求同时包含数字和小写字母 ,并且位置是字符最开始的地方
舍弃.* 变成 (?=.*[0-9])(?=.*[a-z])就错了,因为不存在一个位置既是恰好数字前面的假想空格,又是小写字母前面的假想空格,这是两个很严格,因此冲突的位置。 前面的保留.*的正则表达式,则是两个很宽松的位置,不冲突,甚至还能加个(?=.*[A-Z])。
7.正则表达式的$1和\1:
正则表达式中()是代表分组的意思,
$1代表表达式中第一队圆括号内匹配的内容,在表达式后面出现\1则是代表与第一个小括号中要匹配的内容相同。
非捕获性分组工作模式下分组(?:)会作为匹配校验,并出现在匹配结果字符里面,但不作为子匹配返回。相关参考:
4.正则表达式引擎
-
-
正则表达式引擎有NFA(非确定性有穷自动机),DFA(确定性有穷自动机),绝大多数语言JavaScript的RegExp类,Perl、Ruby和python的re模块,java的regex库都是NFA的引擎。
-
只有NFA才支持lazy和backreference等特性;
-
NFA急于邀功请赏,所以最左子正则式优先匹配成功,因此偶尔会错过最佳匹配结果;DFA则是“最长的左子正则式优先匹配成功”。
-
NFA缺省采用greedy量词(见item 4);
-
NFA可能会陷入递归调用的陷阱而表现得性能极差。
-
-
两类引擎要顺利工作,都必须有一个正则式和一个文本串,一个捏在手里,一个吃下去。DFA捏着文本串去比较正则式,看到一个子正则式,就把可能的匹配串全标注出来,然后再看正则式的下一个部分,根据新的匹配结果更新标注。而NFA是捏着正则式去比文本,吃掉一个字符,就把它跟正则式比较,匹配就记下来:“某年某月某日在某处匹配上了!”,然后接着往下干。一旦不匹配,就把刚吃的这个字符吐出来,一个个的吐,直到回到上一次匹配的地方。 (称之为回溯)