前言
正则表达式( Regular expression)是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子,是用于匹配字符串中字符组合的模式。正则表达式的强大之处在于在几乎所有语言中都可以使用,所以我们更要学好它。后面将会从基本语法,到被用于正则表达式的 exec 和 test 方法, 以及 String 的 match、matchAll、replace、search 和 split 方法,以及正则进阶知识点来复习总结积累。
1.如何创建一个正则表达式
- 使用一个正则表达式字面量,其由包含在斜杠之间的模式组成,如
var reg = /^abc$/
- 用RegExp对象的构造函数,
var re = new RegExp("^abc$")
2.从匹配手机号来学习正则表达式基础知识
元字符
元字符是构造正则表达式的一种基本元素。
元字符 | 说明 |
---|---|
. | (小数点)默认匹配除换行符之外的任何单个字符 |
\w | 匹配字母或数字或下划线或汉字 |
\s | 匹配任意的空白符 |
\d | 匹配数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
通过学习元字符后,我们来写一个简单的匹配手机号的正则表达式。
var reg = /^1\d\d\d\d\d\d\d\d\d\d$/
reg.test('15555555555') // true
但是这样的正则表达式很不简洁,出现大量的重复字符,所以我们要使用重复限定符来优化。
重复限定符
可使被修饰的表达式重复固定次数,也可以限定一定的重复匹配的次数范围。
重复限定符 | 说明 |
---|---|
* | 重复零次或更多次 |
+ | 重复一次或者更多次 |
? | 重复零次或者一次 |
{n} | 重复n次 |
{n,} | 重复n次或者更多次 |
{n,m} | 重复n次到m次 |
有了这些限定符之后,我们就可以对刚才的正则表达式进行改造优化了
var reg = /^1\d{10}$`
reg.test('15555555555') // true
reg.test('11111111111') // true
由上可以看出,我们的正则简洁了不少,但是随便输入以1开头的11位数字,即使不是电话号码也会被匹配成功,所以我们要对这个正则加限定区间。
分组
正则表达式中用小括号()来做分组,也就是括号中的内容作为一个整体。
因此当我们要匹配多个ab时,我们可以这样
如:匹配字符串中包含1到多个aaa开头:
^(aaa)+
条件或
正则用符号 | 来表示或,也叫做分支条件,当满足正则里的分支条件的任何一种条件时,都会当成是匹配成功。
我们都知道:联通有130、131、132、145、155、156、166、175、176、185、186等号段,假如让我们匹配一个联通的号码,那么我们就可以用或条件来处理这个问题。
var reg = /^(130|131|132|145|155|156|166|171|175|176|185|186)\d{8}$/
reg.test('13011111111') // true
reg.test('17611111111') // true
现在我们可以使用条件或来匹配联通手机号了,但是130,131,132等有相同的字符,我们感觉还可以继续优化一下正则。
区间
正则提供一个元字符中括号 [] 来表示区间条件。
- 限定0到9 可以写成[0-9]
- 限定A-Z 写成[A-Z],限定a-z 写成[a-z]
- 限定特定的数字如[166]
那上面的正则我们还可以这样改:
var reg = /^((13[0-2])|(15[56])|17[5-6]|(18[5-6])|145|166)\d{8}$/
reg.test('13011111111') // true
reg.test('14511111111') // true
现在我们的正则表达式看起来已经像那么回事了,但是我们遇到过 +86开头的手机号,但是+号对于正则表达式是特殊字符代表重复一次或者更多次,这样我们该怎么写呢?
转义
斜杠\代表转义, 在特殊字符之前的反斜杠表示下一个字符不是特殊字符,应该按照字面理解。
有了/ 转义字符,所有我们在兼容"+86"这种手机的正则表达式可以这样写:
`var reg = /^(\+86)?((13[0-2])|(15[56])|17[5-6]|(18[5-6])|145|166)\d{8}$/`
`reg.test('+8613011111111') // true`
`reg.test('13011111111') // true`
正则表达式可选参数标志
正则表达式有六个可选参数 (flags) 允许全局和不分大小写搜索等。这些参数既可以单独使用也能以任意顺序一起使用, 并且被包含在正则表达式实例中。
- 使用语法var reg = /pattern/flags;
- 或者var reg = new RegExp(“pattern”, “flags”);
重复限定符 | 说明 |
---|---|
g | 全局搜索 |
i | 不区分大小写搜索 |
m | 多行搜索 |
s | 允许 . 匹配换行符 |
u | 使用unicode码的模式进行匹配 |
y | 执行“粘性(sticky)”搜索,匹配从目标字符串的当前位置开始 |
上面列出的6个我们常用的基本上是前两个,比如我们要将下面’rsTRST’中的不区分大小写的re改为BA
let str = 'rsTRST'
let reg = /rs/gi
str = str.replace(reg, 'BA') // str:BATBAT
总结
现在我们已经掌握了正则表达式的基本语法,以上列出的只是小部分的元字符和语法,正则表达式更多详细的语法还是需要们自己不断去探索来发现它的强大。
参考链接
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions