关于正则表达式:百度工程师带你玩转正则

57次阅读

共计 3955 个字符,预计需要花费 10 分钟才能阅读完成。

作者 | 背阴

导读

在很多技术畛域,都有正则的身影。但许多像我一样的人,只闻其名。因而将正则罕用常识汇总,便于查阅。正则表达式(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 的,咱们下面说的捕捉组,默认指的是编号捕捉组。命名捕捉组,也是捕捉组,只是语法不一样。命名捕捉组的语法如下:(?<name>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]菜鸟教程:

https://www.runoob.com/regexp…

[2]MDN:

https://developer.mozilla.org…\_Objects/RegExp/test

举荐浏览:

Diffie-Hellman 密钥协商算法探索

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

浅谈权限零碎在多利熊业务利用

分布式系统要害门路提早剖析实际

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

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

正文完
 0