如何书写正则表达式
正则常用到的字符很多,列举一些我经常用到的常用字符
常用匹配字符 |
含义 |
[0-9] |
匹配单个数字0-9 |
[a-z] |
匹配单个小写字母 |
[A-Z] |
匹配单个大写字母 |
\s |
匹配所有空白字符,如空格、换行等 |
\n |
匹配所有换行符 |
\b |
匹配边界如字符之间的空格 |
特殊字符 |
含义 |
用法 |
^ |
1. 匹配输入字符串的开始位置 2. 用在[]中时表示 非 |
1. /^http/ 匹配以http开头的字符串 2. /[^a-zA-Z]/ 匹配非字母 |
$ |
匹配输入字符串的结尾位置 |
/.com$/ 匹配以.com结尾的字符串 |
| |
二选一,表示 或 |
/a|b/ 匹配a或者b |
. |
小数点匹配换行符\n之外的任何单个字符 |
/./ 匹配换行符之外的其他字符 |
[] |
中括号匹配一个字符 |
/[aeiou]/ 匹配字母 aeiou 中的一个 |
() |
小括号表示一个子表达式分组 |
匹配的子表达式可以用于以后使用 |
{} |
大括号表示限定一个表达式多少次 |
{n} 匹配n次; {n,} 匹配最少n次; {n, m} 匹配n-m次 |
+ |
匹配前面的子表达式一次或多次 |
/[0-9]+/ 匹配一个数字或多个数字 |
* |
匹配前面的子表达式零次或多次 |
/[0-9]*/ 匹配0次数字或多个数字 |
? |
1. 匹配前面的子表达式零次或一次 2. 指明一个非贪婪限定符 |
1. /[0-9]?/ 2. /<.*?>/ 匹配一个标签如<p> |
匹配特殊字符本身时需要转义,共有以下几个:
* . ? + $ ^ [ ] ( ) { } | \ /
// 字面量
const reg = /[0-9a-z]/g
// 构造函数
const reg = new RegExp('[0-9a-z]', 'g')
其中字面量中不能包含变量,构造函数中可以使用变量:
const name = '战神白起'
const reg = new RegExp(`我的名字叫${name}`)
经常会用 reg.test(str) 方法来判断字符串中是否匹配到了正则表达式:
const reg = /[0-9]/
const str = '文本中有没有数字1234等'
if (reg.test(str)) {
...
}
也经常用str.replace(reg, '') 方法来替换字符串中的内容:
const reg = /[0-9]/g
const str = '文本中的数字1234全部替换成x'
const newStr = str.replace(reg, 'x')
也会用到 str.match(reg) 方法来获取匹配到的内容(也可以用reg.exec(str)):
const reg = /[0-9]+[.][0-9]+[.][0-9]+/g
const str = '这里有个表名字叫做 11.11.11'
str.match(reg) // ['11.11.11']
- match 中的正则表达式如果使用g标志,则将返回与完整正则表达式匹配的所有结果,但不会返回捕获组。
- 如果未使用g标志,则仅返回第一个完整匹配及其相关的捕获组(Array)。 在这种情况下,返回的项目将具有如下所述的其他属性。
正则表达式定义:
正则表达式(Regular Expression)其实就是一门工具,目的是为了字符串模式匹配,从而实现搜索和替换功能。它起源于上个20世纪50年代科学家在数学领域做的一些研究工作,后来才被引入到计算机领域中。从它的命名我们可以知道,它是一种用来描述规则的表达式。而它的底层原理也十分简单,就是使用状态机的思想进行模式匹配。大家可以利用regexper.com这个工具很好地可视化自己写的正则表达式:
/^(0\d{2,3}-\d{7,8})$|^(1[3-9]\d{9})$/ message: "座机(028-2580344)或手机号格式不对",
这是我在项目中校验电话格式的一个正则,咱用regexper.com来看看:
这样看起来很一目了然,再也不需要用的时候在网上搜半天还不满足我们的需求
我们学习一个系统化的知识,一定要从其基础构成来了解。正则表达式的基本组成元素可以分为:字符和元字符。字符很好理解,就是基础的计算机字符编码,通常正则表达式里面使用的就是数字、英文字母。而元字符,也被称为特殊字符,是一些用来表示特殊语义的字符。如^表示非,|表示或等。利用这些元字符,才能构造出强大的表达式模式(pattern)。
常用的字符、元字符我已经在文章的开始罗列了就不过多赘述了。
特定次数
在某些情况下,我们需要匹配特定的重复次数,元字符{
和}
用来给重复匹配设置精确的区间范围。如'a'我想匹配3次,那么我就使用/a{3}/
这个正则,或者说'a'我想匹配至少两次就是用/a{2,}/
这个正则。
以下是完整的语法:
- {x}: x次
- {min, max}:介于min次到max次之间
- {min, }: 至少min次
- {0, max}:至多max次
由于这些元字符比较抽象,且容易混淆,所以我用了联想记忆的方式编了口诀能保证在用到的时候就能回忆起来。
匹配规则 |
元字符 |
联想方式 |
0次或1次 |
? |
且问,此事有还无 |
0次或无数次 |
* |
宇宙洪荒,辰宿列张:宇宙伊始,从无到有,最后星宿布满星空 |
1次或无数次 |
+ |
一加, +1 |
特定次数 |
{x}, {min, max} |
可以想象成一个数轴,从一个点,到一个射线再到线段。min和max分别表示了左闭右闭区间的左界和右界 |