1. 原理
Q:正则表达式是什么?
A:是一种 规则匹配工具(语言) —— 描述了一些 规则 ,能在字符串中寻找满足规则的子字符串
如果从一门语言的角度来看,将正则表达式和英语做类比,可以得到以下结果
| 26个字母 | 多个字母组合单词 | 多个单词组成语句 |
|---|---|---|
| 规则颗粒 | 多个规则颗粒组成规则集合 | 多个规则集合组成正则表达式 |
1.1. 规则颗粒
普通字符:数字、英文、字母等都属于普通字符
元字符:特殊字符
1.2. 规则集合
总结了这几个规则表,就和单词表一样,这些最基本的规则集合需要背下来
组合规则集合表
| 集合 | 意义 |
|---|---|
| [ 和 ] | 范围 |
| ( 和 ) | 分组捕获 |
| [ ]中的^ | 逻辑“非” |
| | | 逻辑“或” |
| m标志 | 匹配多行 |
| i标志 | 忽略大小写 |
| g标志 | 全局模式 |
单字符规则集合表
| 集合 | 意义 |
|---|---|
| . | 除了换行符外的所有字符 |
| \d | 单个数字 |
| \D | 非单个数字 |
| \w | 包括下划线在内的单个字符 |
| \W | 非单个字符 |
| \s | 空白字符,包括(空格、制表符、换页符、换行符) |
| \S | 匹配非空白字符 |
| \b | 单词的开始或结束 |
数量规则集合表
| 集合 | 意义 |
|---|---|
| ? | <= 1次 |
| * | >= 0次 |
| + | >= 1次 |
| {x} | x次 |
| {min,max} | 介于min到max次之间 |
| {min,} | 至少min次 |
| {,max} | 至多max次 |
位置规则集合表
| 集合 | 意义 |
|---|---|
| \b | 单词边界 |
| \B | 非单词边界 |
| 字符串开头 | |
| $ | 字符串结尾 |
2. 实战
2.1 识别电话号码并替换为可以拨打的标签
// 假设有如下字符串
let str = `可以拨打座机号码027-8888-6666或者手机号码(027)150 1234 4321联系商家`
2.1.1 识别号码
文本串当中有两种电话号码,分别是格式1:xxx-xxxx-xxxx和格式2:(xxx)xxx xxxx xxxx
格式1
步骤1: 按顺序提取文本的规则块
分别是:3位数字 -> 符号"-" -> 4位数字 -> 符号"-" -> 4位数字 -> 符号"-"
步骤2:在规则集合表中寻找不同规则块的对应具体写法
数字在单字符规则集合表中,用 \d 表示
次数在数量规则集合表中,用{3}表示
具体的符号"-",直接用"-" 表示
let str = `可以拨打座机号码027-8888-6666或者手机号码(027)150 1234 4321联系商家`;
let reg = /\d{3}\-\d{4}\-\d{4}/;
let matchRes = str.match(reg);
console.log(matchRes); // ["027-8888-6666"]
格式2
步骤1: 按顺序提取文本的规则块
分别是:符号"(" -> 3位数字 -> 符号")" -> 3位数字 -> 符号"空格" -> 4位数字 -> 符号"空格" -> 4位数字
步骤2:在规则集合表中寻找不同规则块的对应具体写法
符号"空格"在单字符规则表中用"\s"表示
因为"("和")"在组合规则表中有特殊的含义:分组,所以想要表示符号"("和")"时,需要添加转义符"\"
其余规则块的映射方式和格式1相同
let str = `可以拨打座机号码027-8888-6666或者手机号码(027)150 1234 4321联系商家`;
let reg = /\(\d{3}\)\d{3}\s\d{4}\s\d{4}/;
let matchRes = str.match(reg);
console.log(matchRes); // ["(027)150 1234 4321"]
根据以上两个正则实践过程,可以简单的总结下使用基础正则的步骤:
- 按顺序提取文本的规则块
- 在规则集合表中寻找不同规则块的对应具体写法
那么怎么同时将两种号码一起识别出来呢?
这就得用到"()"、"|"、g
"( )"包裹所有正则, "|"进行逻辑或处理,g全局查找,而不只是1次
将两种格式的正则组合起来,形成新的正则
let str = `可以拨打座机号码027-8888-6666或者手机号码(027)150 1234 4321联系商家`;
let reg = /(\d{3}\-\d{4}\-\d{4}|\(\d{3}\)\d{3}\s\d{4}\s\d{4})/g;
let matchRes = str.match(reg);
console.log(matchRes); // ["027-8888-6666", "(027)150 1234 4321"]
2.1.1 替换标签
使用字符串的replace方法进行正则替换,其中,以"$"开头,后面追加数字的表达式,例如"$1",是在正则表达式中可以用来表示匹配到的字符串的,比如匹配到了027-8888-6666,replace的第二个参数中,$1就指代的这个号码,其余字符就可以进行手动添加操作
let str = `可以拨打座机号码027-8888-6666或者手机号码(027)150 1234 4321联系商家`;
let reg = /(\d{3}\-\d{4}\-\d{4}|\(\d{3}\)\d{3}\s\d{4}\s\d{4})/g;
str = str.replace(reg,"<a href='tel:$1'>$1</a>")
console.log(str); // 可以拨打座机号码<a href='tel:027-8888-6666'>027-8888-6666</a>或者手机号码<a href='tel:(027)150 1234 4321'>(027)150 1234 4321</a>联系商家
以上就是《入门正则表达式:基础原理与实战》的全部内容了,有错误的地方希望大家能指出,谢谢~