关于前端:正则表达式学习记录

55次阅读

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

目录:1、什么是正则
2、字符的了解
3、循环与反复
4、地位边界
5、子表达式
6、逻辑解决


1、什么是正则表达式

正则表达式实质上就是一个用于字符串模式匹配的工具,实现字符串的搜寻和替换性能。

从其命名咱们能够看进去,它是一种用于形容某种规定的表达式。

咱们要学习的,就是其外部的搜寻及替换的性能,至于其底层实现机制,并不深究。


2、字符的了解

正则表达式基本上是由各种字符组成的,其分为字符和元字符:

字符:就是根底的计算机字符编码,通常正则表达式外面应用的就是数字、英文字母。元字符:就是用来示意非凡语义的字符。如 ^ 示意非,| 示意或等。

正则表达式就是由这两种字符来组成各种理论的规定。

2.1 单个字符匹配

最简略的正则表达式就由数字和字母组成。如我想匹配 ‘banana’ 中的 ‘b’ 这个字符,那我间接应用 /b/ 这个正则就行了,然而咱们用 /a/ 就会匹配到所有的 ‘a’ 字符。

然而如果咱们想要匹配非凡的字符,如 ‘*’ 这个字符自身是特殊字符,咱们就须要转义字符 \ 来让特殊字符失去本来的含意。

/\*/  就是匹配 '*' 这个字符

咱们还能够用 \ 让本来不是特殊字符的字符,让其具备非凡的含意。如咱们要匹配空格、换行、回退等符号的时候,能够用上面这张表记忆:

2.2 多个字符匹配

单个字符的匹配的一对一的,也就是说只能匹配一个后果,这显然不够用。正则表达式又引入了汇合区间和通配符的形式实现一对多的匹配,即一个正则匹配多个不同的字符。

汇合区间用 [] 示意,如:/[123]/ 能匹配字符串中的所有 1 2 3 字符。能够应用元区间 – 来示意汇合区间的范畴,如:/[0-9]/ 能匹配字符串中所有的数字,/[a-z]/ 则能够匹配所有的英文小写字母。

此外,正则表达式还衍生了一批用于匹配区间的简便非凡正则正则表达式,如下:


3、循环与反复

下面讲的是一对一和一对多的字符匹配,这里要讲的就是匹配字符的规定。

所谓的同时匹配多种字符,就是管制正则表达式中某字符的 呈现次数
呈现次数分为:0 次、1 次、无数次、固定次数。

3.1 匹配 0 次或 1 次

元字符 ‘?’ 示意匹配其后面的字符 0 次或 1 次,如:正则表达式 /colou?r/ 就能同时匹配字符串 ‘color’ 和 ‘colour’, 它示意 ‘u’ 能够呈现 0 次或 1 次。

3.2 匹配 0 次或屡次

元字符 ‘*’ 用来示意匹配 0 个字符或无数个字符.

3.3 匹配 1 次或屡次

元字符 ‘+’ 实用于要匹配同个字符呈现 1 次或屡次的状况。

3.4 匹配特定次数

元字符 ‘{}’ 能够匹配特定次数的字符,如:/b{3}/ 示意我想匹配间断的 3 个 b,它还有其余的衍生规定:

- {x}: x 次

- {min, max}:介于 min 次到 max 次之间

- {min,}: 至多 min 次

- {0, max}:至少 max 次

最终,对循环与反复的匹配做个总结:


4、地位边界

所谓地位边界的匹配,就是在长文本字符串中,限度查找字符的地位条件。如咱们只想在单词的结尾或结尾查找字符等。

4.1 单词边界

单词边界就是只匹配独自的单词。比拟常见的场景是在特定的文章或句子中匹配特定单词。如:

The cat scattered his food all over the room.

如果我用 /cat/ 去匹配文章中的单词,最终匹配还会多余地匹配到 ‘scattered’ 这个单词。这时咱们用特殊字符 \b 去包裹咱们想设置边界的单词,如:/\bcat\b/,这样就能只匹配到 ‘cat’ 单词了。

4.2 字符串边界

下面说的是匹配单词,但有时咱们须要匹配一整条字符串,须要如何做呢?
元字符 ‘^’ 能够用来匹配字符串的结尾。而元字符 ‘$’ 能够用来匹配字符串的开端。

另外,要匹配整条字符串,必须要防止换行符的烦扰,这就须要在正则表达式的最初加上字母 ‘m’,这示意采纳多行模式。

举个例子,我要匹配上面这段文字中的 ‘ I am the rain man’ 这段文字:

until  that day,
he finally told me that,
'I am the rain man'

就要应用正则表达式 /^I am the rain man$/m.
除了多行模式,正则匹配还有其余的匹配模式,最终整顿本局部内容如下:


5、子表达式

下面说的是最根底的字符匹配的内容,接下来要说的是正则子表达式。

其核心思想是把正则表达式复杂化。从简略到简单的正则表达式演变通常要采纳 分组、回溯援用和逻辑解决 的思维。利用这三种规定,能够推演出有限简单的正则表达式。

5.1、分组

分组是子表达式的核心思想,其原理是:用 '()’ 蕴含的正则表达式为一组子表达式,多个'()’ 蕴含的子表达式能组合成简单的正则表达式。

5.2、回溯援用

所谓回溯援用,指的是前面的子表达式复用后面曾经匹配到的子字符串。能够了解为变量应用。其应用办法如:\1,\2 别离示意援用的第一个和第二个子表达式。而 \0 示意整个表达式。

回溯援用常常被用在替换字符串中,用 ‘$1’ ‘$2’ 示意要替换的字符串,如下:

let str = 'cad cae gg'

let str1 = str.replace(/(ca)d/g, '$1e')

console.log(str1);   //cae cae gg

其操作等价于:

let str1 = str.replace(/(ca)d/g, 'cae')

有时咱们想限度回溯援用的适用范围,能够用 前向 / 后向查找 实现。

前向查找

是用来限度后缀的,通过 (?=regex) 的子表达式模式来限度后缀的内容,实现前向查找。

如:happy happily 这两个单词,我想取得以 happy 结尾的副词,就能够应用 happ(?=ily)来匹配。

艰深了解,就是匹配到带 ‘ily’ 后缀的 ‘happ’ 局部,具体看上面代码:

let str = 'happy happily'

let str1 = str.replace(/happ(?=ily)/, 'haha')

console.log(str1);   //happy hahaily

后向查找

后向查找 (lookbehind) 是通过指定一个子表达式,而后从合乎这个子表达式的地位登程开始查找合乎规定的字串。

如:apple people 这两个单词,我只想匹配 apple 的 ple,如何实现呢?

/(?<=app)ple/

其实其原理就是与前向相同,还是看那个例子:

let str = 'happy syppy'

let str1 = str.replace(/(?<=sy)ppy/, 'haha')

console.log(str1);   //happy syhaha

这里记住最要害的点:括号里是条件,括号外才是要匹配和替换的内容!

最初回顾下这部分内容:


6、逻辑解决

所谓的逻辑解决,就是说三种逻辑关系,与 或 非。

其中只探讨或 与 非的关系。

或关系,通常给子表达式进行归类应用。比方,我同时匹配 a,b 两种状况就能够应用 (a|b) 这样的子表达式。

而非关系,分为两种状况:一种是字符匹配,另一种是子表达式匹配。
1)字符匹配: 示意非须要应用 ^ 这个元字符。只有在 [和] 外部应用的 ^ 才示意非的关系
2) 子表达式匹配:非关系就要用到后面介绍的前向负查找子表达式 (?!regex) 或后向负查找子表达式(?<!regex)。

该局部总结如下:


最初,只有把握了下面六个次要规定,就能应答大多数用正则表达式实现的匹配和替换问题了。

正文完
 0