8

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

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

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

  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.

我们再来回顾下过程,可以得到以下总结:正则匹配都是从正则第一个条件开始(例子中d的"a"), 去找字符串的第一位。在没有/g情况下,条件1成立再看条件2,直到所有条件都成立,就匹配结束,如果有条件没成立,正则的第一个条件接着去找字符串的第二位,如此往复尝试。在有/g情况下,匹配成功后,也会接着往下匹配,知道所有字符串位被正则校验过。

建议大家多读几遍这个流程,根据对这个流程理解,去想想其他正则表达式执行流程
理解了这个流程,你就算理解的正则的大部分内容了。
下面我还会再写一篇文章关于正则的语法。语法本来应该像英文单词一样,需要大家记住就行了,为啥还要写一篇文章的呢。主要正则里有几个语法确实非常难理解。所以这里有必要写篇文章帮助大家理解下。
下篇文章的题目已经想好了:怎么数出正则表达式里字符位数和零宽断言(?=,?<=, ?!, ?<!),
--- 新更新
文章已经写完啦: https://segmentfault.com/a/11...

关注

欢迎关注小站小滑轮,小站都是平时工作中积累的一些小工具。是不是你们工作中也会遇到呢。关于小站的内容也可以在博客下面留言哦。有什么使用的工具想让我补充,也可以留言。

clipboard.png


philips
719 声望177 粉丝

前端程序员


引用和评论

0 条评论