正则表达式的深入理解

27次阅读

共计 1155 个字符,预计需要花费 3 分钟才能阅读完成。

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

  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 情况下,匹配成功后,也会接着往下匹配,知道所有字符串位被正则校验过。

建议大家多读几遍这个流程

正文完
 0