冷知识:自己也能写正则
1. 前言
大家好,我是 simple ,我的理想是利用科技手段来解决生活中遇到的各种问题。
今天想和大家唠唠正则表达式,很多开发的同事都对正则表达式处于比较微妙的关系,让你写你不会,让你看你基本上能看懂。遇到开发要用,就直接百度,百度不到就用indexOf或者includes。
其实正则说难也不难,只要稍微了解一下里面的规则对付日常开发还是比较容易的。
2. 正则表达式基础
2.1 正则表达式的语法和基本规则
下面是两种正则表达式的语法和定义规则。
- 正则表达式对象:使用
RegExp
构造函数可以创建一个正则表达式对象。构造函数接受两个参数:模式字符串和标志(可选) - 正则表达式字面量:使用正斜杠(
/
)将正则表达式包裹起来,并写在两个正斜杠之间。例如,/pattern/
是一个简单的正则表达式字面量。
const reg1 = new RegExp("pattern")
const reg2 = /pattern/ // 常用
2.2 正则表达式的模式匹配方法
使用正则表达式来测试字符串是否符合规则,可以使用test测试。若符合返回true,否则返回false。
const reg = /pattern/
reg.test('pattern')
test(str)
: 检测字符串str
是否与正则表达式匹配,返回布尔值。exec(str)
: 在字符串str
中执行正则表达式的匹配,返回一个数组,包含匹配到的结果。match(regex)
: 在字符串中使用正则表达式匹配,返回一个数组,包含匹配到的结果。search(regex)
: 在字符串中搜索与正则表达式匹配的位置,返回匹配的索引。replace(regex, replacement)
: 在字符串中使用正则表达式进行替换,将匹配到的部分替换为指定的内容。split(regex)
: 根据正则表达式将字符串拆分为数组。
3. 字符匹配与转义
3.1 字面字符匹配
正则表达式可以直接匹配字面字符,比如你要匹配 pattern
,只需要声明一个 /pattern/
,这应该没啥好说的。
3.2 转义字符的使用
反斜杠
因为正则表达式里面有很多符号代表了不同的含义,因此如果需要匹配一些特殊字符,就需要加一个转义符\
,这个不用记,你要是不记得哪些标点符号算是特殊的,就全部都加上。
// 举例:匹配一个 .
const reg1 = /./ // 匹配任意除换行符以外的字符
const reg2 = /\./ // 仅匹配一个.字符
反斜杠+字母 当你想要匹配一类字符的时候,你又不想要使用穷举的方式。比如你想要匹配一个数字,你不想从0写到9,那你就往往需要用到这个转移符号。
\d
匹配一个数字字符。\s
匹配任何空白字符,包括空格、制表符、换页符等等。\w
匹配字母、数字、下划线。
上面三个是比较常用的转义符定义,小写就是匹配符合的字符,大写就是匹配不符合的字符。即当你要匹配一个非数字字符的字符串时,使用\D
,其他同理(当然,这里只针对\d,\s和\w)。
3.3 元字符
刚刚说到过,我们在使用正则表达式的时候可能会用上一些字符来表示具体规则,比如使用.
,$
,^
,-
等,如果想要匹配这些特殊字符,需要在前面添加反斜杠。详情请看3.2
。
^
匹配输入字符串的开始位置。$
匹配输入字符串的结束位置。.
匹配除换行符(\n、\r)之外的任何单个字符。
// 举例:匹配长度为1的数字字符串
const reg = /^\d$/
/^\d$/.test(`1`)
3.4 修饰符
标记不写在正则表达式里,标记位于表达式之外,格式如下:
g
全局匹配。i
不区分大小写。m
多行匹配,使边界字符^
和$
匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
const reg = /pattern/gi
3.5 量词
量词不能单独使用,修饰前面出现的表达式。
*
出现任意次。?
出现0次或1次+
出现1次或多次{n, m}
最多出现m次,最少出现n次
const reg = /zo+/
reg.test('zoo') // true
reg.test('zo') // true
4. 常见的正则表达式应用以及解析
4.1 邮箱地址的验证
- 邮箱地址以字母、数字、下划线、点、百分号、加号或减号开头,至少出现一次。
- 然后是一个
@
符号。 - 接下来是一个或多个字母、数字、点或减号的字符。
- 然后是一个点字符,需要进行转义。
- 最后是两个或更多的大小写字母。
// 正则表达式模式
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
// 邮箱地址验证函数
function validateEmail(email) {
return emailPattern.test(email);
}
// 示例使用
const email1 = 'example@example.com';
const email2 = 'invalid_email.com';
console.log(validateEmail(email1)); // 输出: true
console.log(validateEmail(email2)); // 输出: false
^
:表示匹配字符串的开头。[a-zA-Z0-9._%+-]+
:表示匹配一个或多个大小写字母、数字、下划线、点、百分号、加号或减号的字符。@
:表示匹配一个@
符号。[a-zA-Z0-9.-]+
:表示匹配一个或多个大小写字母、数字、点或减号的字符。.
:表示匹配一个点字符,需要使用 `` 进行转义。[a-zA-Z]{2,}
:表示匹配两个或更多大小写字母的字符。$
:表示匹配字符串的结尾。
4.2 URL 地址的提取
- URL 地址以
http://
或https://
或ftp://
开头。 - 紧接着是一个或多个除空格、斜杠、美元符号、问号和井号以外的字符。
- 然后是一个任意字符。
- 最后是零个或多个非空格字符。
const html = '<div class="container">Hello, world!</div>';
// 正则表达式模式
const tagPattern = /<([a-zA-Z0-9]+)[^>]*>([\s\S]*?)<\/\1>/g;
// 解析 HTML 函数
function parseHTML(html) {
const tags = [];
let match;
while ((match = tagPattern.exec(html)) !== null) {
const tagName = match[1];
const content = match[2];
tags.push({ tagName, content });
}
return tags;
}
// 示例使用
const parsedTags = parseHTML(html);
console.log(parsedTags); // 输出: [{ tagName: 'div', content: 'Hello, world!' }]
(https?|ftp)
:表示匹配http
或https
或ftp
。http
或https
:匹配http
或https
。?
:表示前面的字符(s
)可选。ftp
:匹配ftp
。
://
:表示匹配://
。[^\s/$.?#]
:表示匹配除空格、斜杠、美元符号、问号和井号以外的任意字符。.
:表示匹配任意字符。[^\s]*
:表示匹配零个或多个非空格字符。/gi
:表示使用全局匹配模式(g
)和不区分大小写匹配模式(i
)。
该正则表达式使用了分组 (https?|ftp)
来匹配不同的协议,使用 []
表示字符类来匹配除特定字符以外的任意字符,使用 .
匹配任意字符,使用 *
匹配零个或多个字符。
使用 /g
标志表示全局匹配,即匹配所有符合条件的 URL 地址。使用 /i
标志表示不区分大小写,即不考虑 URL 地址中的字母大小写。
正则表达式工具和调试技巧
进阶文章
转载自:https://juejin.cn/post/7249193764886757435