有些知识,我们只需要付出一点点时间,把它掌握了,会大大提高我们的效率,节省我们的时间。正则表达式就是这样的知识,但是,作为入行好几年的我来说,正则表达式一直是一头雾水,今天决定把它好好研究研究。
1.什么是正则表达式
正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串。在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本。
通俗来讲:正则表达式是一组由字母和符号组成的特殊文本, 它可以用来从文本中找出满足你想要的格式的句子.
2.js中Regexp对象
Javascript 通过内置对象RegExp支持正则表达式,有两种方法实例化RegExp对象
2.1字面量方法
const reg = /bqingb/g
2.2构造函数
const reg = new RegExp(’bqingb’,‘g’)
3.正则表达式语法
3.1 元字符
正则表达式主要依赖于元字符. 元字符不代表他们本身的字面意思, 他们都有特殊的含义. 一些元字符写在方括号中的时候有一些特殊的意思. 以下是一些元字符的介绍:
点运算符 .
点运算符匹配除了换行符以外的任意字符
3.2 字符类
[] 方括号用来指定一个字符集,在方括号中使用连字符来指定字符集的范围,并且方括号中的字符集不关心顺序
否定字符类
一般来说表示一个字符串的开头,但当它用在方括号里面的时候,表示否定的关系。比如[ar]匹配一个后面跟着ar的除了c的任意字符。
3.3 重复次数
*3.3.1 字符
*号匹配在 *之前的字符出现大于等于0次,就是出现0次或多次
3.3.2 字符
号匹配 号之前的字符出现 >=1 次.
3.3.3 ?字符
?表示在?之前的字符为可选,即表示出现0次或者1次。比如[T]?he匹配字符串he和The
3.4 {} 号
在正则表达式中 {} 是一个量词, 常用来一个或一组字符可以重复出现的次数. 例如, 表达式 [0-9]{2,3} 匹配最少 2 位最多 3位 0~9 的数字.
3.5 范围类[-]
正则表达式支持一定的范围规则比如[a-z] [0-9] [A-Z]
3.6 | 或运算符
3.7 转码特殊字符
反斜线 在表达式中用于转码紧跟其后的字符. 用于指定 { } [ ] / * . $ ^ | ? 这些特殊字符.如果想要匹配这些特殊字符则要在其前面加上反斜线 .
3.8 边界
字符 | 含义 |
---|---|
^ | 以^后面的字符开头 |
$ | 以 $前面的字符结尾 |
b | 单词边界,指[a-zA-Z0-9]之外的字符 |
B | 非单词边界 |
3.9 修饰符(i, g, m)
修饰符 | 描述 |
---|---|
i | 忽略大小写 |
g | 全局搜索 |
m | multiple lines多行匹配 |
4. 简写字符集
正则表达式提供一些常用的字符集简写. 如下:
简写 | 描述 |
---|---|
. | 除换行符外的所有字符 |
w | 匹配所有字母数字,等同于[a-zA-Z0-9] |
W | 匹配所有非字母数字,即符号,等同于[^w] |
d | 匹配数字: [0-9] |
D | 匹配非数字:[^d] |
s | 匹配所有空格字符,等同于: [tnfrp{Z}] |
S | 匹配所有非空格字符: [^s] |
f | 匹配一个换页符 |
n | 匹配一个换行符 |
r | 匹配一个会车符 |
t | 匹配一个制表符 |
5. 贪婪匹配与惰性匹配 (Greedy vs lazy matching)
正则表达式默认采用贪婪匹配模式,在该模式下意味着会匹配尽可能长的子串。我们可以使用 ? 将贪婪匹配模式转化为惰性匹配模式
6. 零宽度断言(前后预查)
正则表达式中有前瞻(Lookahead)和后顾(Lookbehind)的概念,这两个术语非常形象的描述了正则引擎的匹配行为。需要注意一点,正则表达式中的前和后和我们一般理解的前后有点不同。一段文本,我们一般习惯把文本开头的方向称作“前面”,文本末尾方向称为“后面”。但是对于正则表达式引擎来说,因为它是从文本头部向尾部开始解析的(可以通过正则选项控制解析方向),因此对于文本尾部方向,称为“前”,因为这个时候,正则引擎还没走到那块,而对文本头部方向,则称为“后”,因为正则引擎已经走过了那一块地方。
6.1 正向前瞻
定义一个正向前瞻要使用(),在括号内部使用一个问好和等号:(?=xxx)
6.2 负向前瞻
负向前瞻只需要把正向前瞻的=改成! 即(?!xxx) 表达式 (T|t)he(?!sfat) 匹配 The 和 the, 且其后不跟着(空格)fat.
6.3 正向后顾
定义一个正向后顾要使用(),在括号内部使用一个问好、小于号和等号?<=xxx 用于筛选所有匹配结果, 筛选条件为 其前跟随着断言中定义的格式. 例如, 表达式 (?<=(T|t)hes)(fat|mat) 匹配 fat 和 mat, 且其前跟着 The 或 the.
6.4 负向后顾
和正向后顾相似,只需要把=改成!,?<! 用于筛选所有匹配结果, 筛选条件为 其前不跟随着断言中定义的格式. 例如, 表达式 (?<!(T|t)hes)(cat) 匹配 cat, 且其前不跟着 The 或 the.
7.应用
7.1 手机号正则
/^1[34578][0-9]{9}$/
7.2 URL分组替换
/http:(//. .com)/
7.3 日期匹配与分组替换
/^(d{4})/-/-$/
好了好了,就这么多了,祝大家学习愉快