为了更好的理解正则表达式,咱们须要思考几个问题。正则表达式
针对这三类问题:正则表达式提供相应的语法。segmentfault
针对其语法,咱们还须要知道同样东西:什么语法匹配字符位,什么语法匹配位置,由于正则毕竟是匹配字符串的。因此每个正则表达式出来必定要知道他会匹配出几个字符。
第一类和第二类的语法都是匹配字符位的,第三类语法都是匹配位置,不占字符位。数组
在把语法的分类了解清楚了,下面咱们就须要了解正则的匹配执行的流程,这个对理解正则很是重要。
我跟据个人理解,但愿可以让读者简单的理解下。以一个例子开头吧:工具
var str="tfabCWa5684ab"; var reg=/ab/g; console.log(str.match(reg));
正则的匹配过程:
首先由正则表达式的字符"a"获取控制权,从位置0处开始匹配尝试,匹配字符"t"失败,控制权还在a上,将从位置1开始尝试,匹配字符"f"失败,控制权仍是在a上,将从2位置开始匹配,匹配字符“a”成功,而后控制权转交给"b",从位置3处开始匹配,配字符"b"成功,记录下这个匹配结果。控制权再次回到"a"(由于/g须要找出所有), 它从位置3(这个地方很重要)处开始匹配,匹配字符"b"失败,控制权还在"a"上,接着往下匹配,直到从位置6处,匹配字符"a"成功,控制权转交给"b", 从位置7开始匹配,匹配字符5失败, 控制权回到a上,接着往下匹配,直到从位置11处,匹配字符"a"成功,控制权转交给"b",从位置12开始匹配,匹配字符"b"成功,记录下这个匹配结果。因此最终匹配结果是两次ab,一次在index=2,一次在index=11.spa
咱们再来回顾下过程,能够获得如下总结:正则匹配都是从正则第一个条件开始(例子中d的"a"), 去找字符串的第一位。在没有/g状况下,条件1成立再看条件2,直到全部条件都成立,就匹配结束,若是有条件没成立,正则的第一个条件接着去找字符串的第二位,如此往复尝试。在有/g状况下,匹配成功后,也会接着往下匹配,知道全部字符串位被正则校验过。code
建议你们多读几遍这个流程,根据对这个流程理解,去想一想其余正则表达式执行流程
理解了这个流程,你就算理解的正则的大部份内容了。
下面我还会再写一篇文章关于正则的语法。语法原本应该像英文单词同样,须要你们记住就好了,为啥还要写一篇文章的呢。主要正则里有几个语法确实很是难理解。因此这里有必要写篇文章帮助你们理解下。
下篇文章的题目已经想好了:怎么数出正则表达式里字符位数和零宽断言(?=,?<=, ?!, ?<!),
--- 新更新
文章已经写完啦: https://segmentfault.com/a/11...blog
欢迎关注小站小滑轮,小站都是平时工做中积累的一些小工具。是否是大家工做中也会遇到呢。关于小站的内容也能够在博客下面留言哦。有什么使用的工具想让我补充,也能够留言。ip