JS——正则表达式及应用

前言:
正则表达式一直是困扰很多同学的一门技术,当然也包括我。大多数时候我们在开发过程中要用到某些正则表达式的时候,都会打开谷歌或百度直接搜索然后拷贝粘贴。当下一次再遇到相同问题的时候,同样的场景又再来一遍。作为一门用途很广的技术,我相信深入理解正则表达式并能融会贯通是值得的。
首先,我们要知道:
正则表达式(Regular Expression)其实就是一门工具,目的是为了字符串模式匹配,从而实现搜索和替换功能。它起源于上个20世纪50年代科学家在数学领域做的一些研究工作,后来才被引入到计算机领域中。从它的命名我们可以知道,它是一种用来描述规则的表达式。而它的底层原理也十分简单,就是使用状态机的思想进行模式匹配。
正则表达式的基本组成元素可以分为:字符和元字符。字符,就是基础的计算机字符编码,通常正则表达式里面使用的就是数字、英文字母。而元字符,也被称为特殊字符,是一些用来表示特殊语义的字符。如^表示非,|表示或等。利用这些元字符,才能构造出强大的表达式模式。
单个字符:
最简单的正则表达式可以由简单的数字和字母组成,没有特殊的语义,纯粹就是一一对应的关系。如想在’apple’这个单词里找到‘a’这个字符,就直接用/a/这个正则就可以了
但是如果想要匹配特殊字符的话,就得请出我们第一个元字符***, 它是转义字符字符,顾名思义,就是让其后续的字符失去其本来的含义。举个例子:
我想匹配
这个符号,由于*这个符号本身是个特殊字符,所以我要利用转义元字符\来让它失去其本来的含义:/\*/
特殊字符

特殊字符 正则表达式 记忆方式
换行符 \n new line
换页符 \f form feed
回车符  \r return
空白符 \s space
制表符 \t tab
垂直制表符 \v vertical tab
回退符  [\b] backspace,使用[]符号是避免和\b重复

多个字符
单个字符的映射关系是一对一的,即正则表达式的被用来筛选匹配的字符只有一个。而这显然是不够的,只要引入集合区间和通配符的方式就可以实现一对多的匹配了。
在正则表达式里,集合的定义方式是使用中括号[和]。如/[123]/这个正则就能同时匹配1,2,3三个字符。那如果我想匹配所有的数字怎么办呢?从0写到9显然太过低效,所以元字符-就可以用来表示区间范围,利用/[0-9]/就能匹配所有的数字, /[a-z]/则可以匹配所有的英文小写字母。

匹配区间 正则表达式 记忆方式
除了换行符之外的任何字符 . 句号, 除了句子结束符
单个数字,  [0-9]  \d digit
除了[0-9]  \D  not digit
包括下划线在内的单个字符 [A-Za-z0-9_] \w word
非单字字符 \W not word
匹配空白字符,包括空格、制表符、换页符和换行符  \s  space
匹配非空白字符 \S not space

循环和重复
以上是一对一和一对多的字符匹配。接下来,是如何同时匹配多个字符。要实现多个字符的匹配我们只要多次循环,重复使用我们的之前的正则规则就可以了。那么根据循环次数的多与少,我们可以分为0次,1次,多次,特定次。
0 | 1
元字符?代表了匹配一个字符或0个字符。如果要匹配color和colour这两个单词,就需要同时保证u这个字符是否出现都能被匹配到。所以正则表达式应该是这样的:/colou?r/。
大于等于0次
元字符*用来表示匹配0个字符或无数个字符。通常用来过滤某些可有可无的字符串。
大于等于1次
元字符+适用于要匹配同个字符出现1次或多次的情况。
特定次数
在某些情况下,我们需要匹配特定的重复次数,元字符{和}用来给重复匹配设置精确的区间范围。如’a’我想匹配3次,那么我就使用/a{3}/这个正则,或者说’a’我想匹配至少两次就是用/a{2,}/这个正则。

- {x}: x次

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

- {min, }: 至少min次

- {0, max}: 至多max次```

接下来是如何创建正则表达式对象*
JavaScript中使用RegExp对象来封装一个正则表达式,并提供相关的方法和属性。
两种创建方法
字面量

let reg = /\bis\b/g; //g表示全文匹配
let str = "He is a boy. This is a dog. Where is she?";
console.log(str.replace(reg, "IS"));

构造函数

let reg = new RegExp("\\bis\\b", "g");
let str = "He is a boy. This is a dog. Where is she?";
console.log(str.replace(reg, "IS"));

边界
在长文本字符串查找过程中,我们常常需要限制查询的位置。比如我只想在单词的开头结尾查找。
正则表达式还提供了匹配边界的字符。

^,以 xxx 开始
$,以 xxx 结束
\b,单词边界
\B,非单词边界

子表达式
字符匹配介绍完后,更加高级的用法就得用到子表达式了。通过嵌套递归和自身引用可以让正则发挥更强大的功能。
分组
例如: Byron{3}表示对 n 匹配 3 次,而不是 Byron。如果要对 Byron 匹配三次,就需要对其进行分组。

console.log("a1b2c3d4".replace(/[a-z]\d{3}/g, "X"));//a1b2c3d4
console.log("a1b2c3d4".replace(/([a-z]\d){3}/g, "X")); //Xd4

量词

匹配字符连续出现 n 次的字符串。
?,出现 0 次或 1 次
+,出现 1 次或多次
*,出现 0 次或多次
{n},出现 n 次
{n, m},出现 n 到 m 次
{n,},出现 n 次或更多次

贪婪模式
例如:\d{3,6}匹配"12345678"的结果是什么?默认情况下,正则表达式会尽可能多的匹配,即采用 6 次来匹配。

console.log("12345678".replace(/\d{3,6}/g, "x"));
//x78

非贪婪模式
与贪婪模式相反,即尽可能少的匹配,一旦成功匹配就不再继续尝试其他的可能性。在模式后面加上?

console.log("12345678".replace(/\d{3,6}?/g, "x"));
//x87

总结
对于正则来说,符号是比较抽象的。针对不好记忆的特点,通过分类和联想的方式努力让其变得有意义。从一对一的单字符,再到多对多的子字符串介绍,再到更高级的子表达式来构造更高级的正则表达式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值