正则表达式的深刻理解

为了更好的理解正则表达式,咱们须要思考几个问题。正则表达式

  1. 咱们要匹配确切的内容。
  2. 咱们要匹配类型的内容,包括同类(数字,字母)和次数。
  3. 咱们要匹配的相关内容,同时在位置(这个概念很重要)上要有要求。好比它的前面不能是什么,后面不能是什么。

针对这三类问题:正则表达式提供相应的语法。segmentfault

  1. 第一类问题:比较简单,咱们直接写咱们想要的值就能够了,也是用的最多的。好比: /l/, /ge/ /hello/
  2. 第二类问题:这个状况就比较多,例如,匹配数组,匹配大写,匹配多个字符。针对这个提供一系列的语法:好比:/d, /w, [a-z], [0-9], ., +, *......
  3. 第三类问题:这个状况其实相对简单写,毕竟位置就那么几种(开头,结尾,前,后)。正则也提供了语法:好比:^, $, \b, \B, (?=), (?!), (?<=), (?<!)

针对其语法,咱们还须要知道同样东西:什么语法匹配字符位,什么语法匹配位置,由于正则毕竟是匹配字符串的。因此每个正则表达式出来必定要知道他会匹配出几个字符。
第一类和第二类的语法都是匹配字符位的,第三类语法都是匹配位置,不占字符位。数组

在把语法的分类了解清楚了,下面咱们就须要了解正则的匹配执行的流程,这个对理解正则很是重要
我跟据个人理解,但愿可以让读者简单的理解下。以一个例子开头吧:工具

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

clipboard.png

相关文章
相关标签/搜索