冷知识:自己也能写正则
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