如何理解正则表达式匹配过程
2017-02-10 14:23
302 查看
本文通过实例,为你介绍正则表达式匹配过程,通过对匹配过程的理解,将有助于你更加深入理解正则表达式匹配逻辑。
正则:
匹配结果:
匹配过程如下:
正则:
匹配结果:
匹配过程如下:
更多示例,读者可尝试推演一下:
关于匹配次数
正则:
console.log(('12345').match(/\d*/g));
匹配结果:
["12345", ""]
匹配过程如下:
第一次匹配:
\d*,因为没有位置限定,因此是从文本开始位置开始,也就是^
这个^是虚拟字符,也就是12345里的1前面的位置
\d*,贪婪匹配,0-n个,尽可能多匹配,因此,12345都匹配了
此时,正则匹配的位置到了5后面,完成第一次匹配。
第二次匹配:
但是,因为g模式,做的是全局匹配,因此,\d*从5后面位置开始,继续匹配,直到文本结束位置,也就是$
这个$也是虚拟字符,匹配文本的结束位置
\d*,因为是0-n个,此时,利用的0个匹配,因此得到"",完成第二次匹配。
上面,主要利用的知识点有:
1. 开始(^)和结束位置($)
2. 贪婪模式
3. * 的含义
4. 正则匹配的位置移动原理(正则引擎匹配原理)
正则:
console.log(('12345').match(/1*/g));
匹配结果:
["1", "", "", "", "", ""]
匹配过程如下:
1* 首先从12345的1前面位置开始,贪婪模式,尽可能多匹配1,因此,匹配完后,正则的匹配开始位置到了2前面位置
1* 从2前面位置开始,单字符匹配,因为1没法匹配2,因此,用了*的特性,匹配0个,正则的匹配开始位置到了3前面位置
1* 从3前面位置开始,单字符匹配,因为1没法匹配3,因此,用了*的特性,匹配0个,正则的匹配开始位置到了4前面位置
1* 从4前面位置开始,单字符匹配,因为1没法匹配4,因此,用了*的特性,匹配0个,正则的匹配开始位置到了5前面位置
1* 从5前面位置开始,单字符匹配,因为1没法匹配5,因此,用了*的特性,匹配0个,正则的匹配开始位置到了5后面位置
1* 从5后面位置,单字符匹配,匹配文本结束位置,没有匹配1,用了*的特性,匹配0个,正则的匹配完成
更多示例,读者可尝试推演一下:
console.log(('12345').match(/12345??/g)); //1234
console.log(('12345').match(/12345?/g)); //12345
注:?? 等价于 {0,1}? 非贪婪模式,不匹配优先
? 等价于 {0,1} 贪婪模式,匹配优先
关于匹配次数
??和
?的讲解可以参考《正则表达式匹配次数》
相关文章推荐
- 如何用正则表达式匹配出变量
- php中utf-8编码下用正则表达式如何匹配汉字
- php正则表达式如何找到匹配模式中的最后一组
- php中utf-8编码下用正则表达式如何匹配汉字
- php中utf-8编码下用正则表达式如何匹配汉字
- 如何匹配嵌套Html标签(正则表达式)
- javascript正则表达式多行匹配和RegExp理解
- use re 'debug' 可以查看正则表达式的匹配过程。
- 正则表达式问题:如何理解/href\s*=\s*(?:"(?<1>[^"]*)"|(?<1>\S+))/(转载)
- 正则表达式匹配过程
- 正则表达式如何匹配换行符
- .net正则表达式逆序环视中反向引用来看匹配过程。
- [小知识] grep中如何使用正则表达式匹配数字
- java正则表达式中如何匹配“$”和“^”
- 正则表达式:如何匹配反斜杠 "/"
- 正则表达式要匹配双引号"如何才能匹配
- mysql语句中如何用正则表达式匹配数据
- 如何利用正则表达式匹配花括号内的内容
- PHP 正则表达式如何匹配img中任意属性
- php如何用正则表达式判断一种模式匹配了几次