百度工程师带你玩转正则

作者 | 向阳

导读

在很多技术领域,都有正则的身影。但许多像我相同的人,只闻其名。因而将正则常用常识汇总,便于查阅。正则表达式(Regular Expression)是用于描绘一组字符串特征的形式,用来匹配特定的字符串。通过特别字符+普通字符来进行形式描绘,从而到达文本匹配意图东西。因而正则表达式是用于匹配字符串中字符组合的形式。

正则表达式能够很方便的提取咱们想要的信息,所以正则表达式是一个很重要的常识点!欢迎大家一起学习~

全文4082字,预计阅览时刻11分钟。

01 正则概述

正则表达式是用于匹配字符串中字符组合的形式。在 JavaScript中,正则表达式也是目标。

02 基本语法

2.1 定义办法

字面量办法:/^\d+$/g,

new RegExp(“^\\d+$”, “g”)

2.2 修饰符

百度工程师带你玩转正则

2.3 元字符

一个正则表达式形式是由简单的字符所构成的,比方 /abc/;或者是简单和特别字符的组合,比方 /ab*c/

百度工程师带你玩转正则

2.4 其他断语

断语的组成之一是鸿沟。关于文本、词或形式,鸿沟能够用来标明它们的起始或停止部分,分为鸿沟类断语与其他断语。鸿沟类断语有 ^, $, \b, \B,其他断语有 x(?=y), x(?!y), (?<=y)x, (?<!y)x。

百度工程师带你玩转正则

注:需求关注写法与真实匹配到的字符串!!!

03 正则目标的特点和办法

3.1 特点

百度工程师带你玩转正则

△正则特点和办法

百度工程师带你玩转正则

var reg=/ab/g;
reg.ignoreCase; // false,检测是否含有i 特点
reg.global; // true,检测是否含有g 特点
reg.multiline; // false,检测是否含有m 特点
reg.source; // "ab",匹配内容体
var regex =new RegExp("\u{61}","u");
regex.unicode // true
const str1 = "foo bar foo";
const regex1 = /foo/dg;
regex1.hasIndices // Output: true
regex1.exec(str1).indices[0] // Output: Array [0, 3]
regex1.exec(str1).indices[0] // Output: Array [8, 11]
const str2 = "foo bar foo";
const regex2 = /foo/;
regex2.hasIndices // Output: false
regex2.exec(str2).indices // Output: undefined

3.2 相关办法

这些形式被用于RegExp的exec和test办法,以及String的match、matchAll、replace、search和split办法。

百度工程师带你玩转正则

test

/str/.test('hello world');  //要求字符串包括string,所以回来false

exec

 var reg=/ab/g;
 var str="abababab";
 reg.lastIndex //0
 reg.exec(str)//["ab",index:0,input:"abababab"]
reg.lastIndex//2
reg.exec(str)//["ab",index:2,input:"abababab"]
reg.lastIndex//4
reg.exec(str)//["ab",index:4,input:"abababab"]
reg.lastIndex//6
reg.exec(str)//["ab",index:6,input:"abababab"]
reg.lastIndex//8
reg.exec(str)//null
reg.lastIndex//0
reg.exec(str)//["ab",index:0,input:"abababab"]
//reg.lastIndex是可手动修改的
reg.lastIndex=0; // reg.lastIndex重置0
reg.exec(str)
// ["ab",index:0,input:"abababab"],与上面成果中的index相同
// 若匹配规矩不含有global特点,那在允许exec()办法后lastIndex值始终为0
var reg=/ab/;
var str="abababab";
reg.lastIndex // 0
reg.exec(str) // ["ab",index:0,input:"abababab"]
reg.lastIndex // 0
reg.exec(str) // ["ab",index:0,input:"abababab"]

search

"hello world".search(/w/) // 6

match

const str = "hello world";
const reg1 = /o/;
str.match(reg1); // ['o', index: 4, input: 'hello world', groups: undefined]
const reg2 = /o/g;
str.match(reg2); // ['o', 'o']

replace

"hello world".replace(/world/g,"baidu"); // hello baidu

split

var str="a1b2c";
var reg=/\d/g;
str.split(reg); // ["a","b","c"],行将分隔符两侧的字符串进行拆分
var reg=/(\d)/g; // "()"代表记载反向引证,将匹配表达式也回来回来
str.split(reg); // ["a","1","b","2","c"]

04 捕获组与非捕获组

正则表达式分组分为捕获组(Capturing Groups)与非捕获组Non-Capturing Groups。正则里边是用成对的小括号来表明分组的,如(\d)表明一个分组,(\d)(\d)表明有两个分组,(\d)(\d)(\d)表明有三个分组,有几对小括号元字符组成,就表明有几个分组。

4.1 分组的意图

  1. 作为可选分支

  2. 简写重复形式

  3. 缓存捕获数据及反向引证(只有捕获组才能够被反向引证)

4.2 捕获组

当你把一个正则表达式用一对小括号包起来的时候,就形成了一个捕获组。它捕获的便是分组里边的正则表达式匹配到的内容。

/(\w)+/.test('hello world') //(\w)组成一个捕获组

4.3 非捕获组

/(?:\w)+/.test('hello world') //(\w)组成一个捕获组

使用场景:

不需求用到分组里边的内容的时候,用非捕获组,首要是为了提高功率,由于捕获组多了一步保存数据的过程,所以一般会多消耗一些时刻。

4.4 命名捕获组

捕获组其实是分为编号捕获组Numbered Caputuring Groups和命名捕获组Named Capturing Groups的,咱们上面说的捕获组,默认指的是编号捕获组。命名捕获组,也是捕获组,仅仅语法不相同。命名捕获组的语法如下:(?group) 或 (?’name’group),其间 name 表明捕获组的名称,group 表明捕获组里边的正则。

const str = '2022-12-15';
const reg =  /(\d{4})-(\d{2})-(\d{2})/;
str.match(reg)
// ['2022-12-15', '2022', '12', '15', index: 0, input: '2022-12-15', groups: undefined]
const isNotCaputuringReg = /(?:\d{4})-(?:\d{2})-(?:\d{2})/;
str.match(isNotCaputuringReg)
// ['2022-12-15', index: 0, input: '2022-12-15', groups: undefined]
const namedCaputuringReg = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/;
str.match(namedCaputuringReg)
// 匹配成果如下图

百度工程师带你玩转正则

05 正则中有趣用法

5.1 贪婪匹配与非贪婪匹配

贪婪匹配即照着”量词”规矩中要求的更多个的状况去做匹配。

非贪婪匹配,在”量词”规矩后边多加一个问号”?”。

“量词”包括 ?、*、+、{}、{n,}、{n,m}

    var str="aaaaa";
    var reg=/a+/g;
    str.match(reg);//["aaaaa"]
    var reg=/a??/g;//第一个问号代表0~1个,第二个问号代表能取0就不取1去做匹配
    str.match(reg);//["","","","","",""]

5.2 反向引证

反向引证便是正则中’ \1 ‘用法,下列代码中(\w)首要匹配a,’\1’引证a,后面量词’+’表明出现一次获屡次。

var str = 'aaaaabbbbbbcccccccd'
var reg = /(\w)\1+/g
str.replace(reg,'$1') // $1是第一个小括号中的内容
// abc

06 易错用法

/[1-51]/.test('6')
'aaa'.match(/a*?/g)
false // 可匹配1,2,3,4,5,同(1-5||1)
['', '', '', ''] //注意:字符串有三个a,数组有四个空字符串

——END——

参考资料:

[1]菜鸟教程:

www.runoob.com/regexp/rege…

[2]MDN:

developer.mozilla.org/zh-CN/docs/…

推荐阅览:

Diffie-Hellman密钥洽谈算法探究

贴吧低代码高性能规矩引擎设计

浅谈权限系统在多利熊事务应用

分布式系统要害路径延迟剖析实践

百度工程师教你玩转设计形式(装饰器形式)

百度工程师带你体验引擎中的nodejs