入门正则表达式:基础原理与实战

354 阅读2分钟

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"]

根据以上两个正则实践过程,可以简单的总结下使用基础正则的步骤:

  1. 按顺序提取文本的规则块
  2. 在规则集合表中寻找不同规则块的对应具体写法

那么怎么同时将两种号码一起识别出来呢?

这就得用到"()"、"|"、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>联系商家

以上就是《入门正则表达式:基础原理与实战》的全部内容了,有错误的地方希望大家能指出,谢谢~