javascript正则表达式 | 知识梳理

正则表达式由pattern和flags组成,我不知道怎么翻译这个,我用我自己的话解释一下,pattern可以理解为一个函数(做什么), flags可以理解为参数, 比如flags为g为全局匹配,i为忽略大小写。
字面量

这种方法最方便简单

// /pattern/flags
let reg = /\d/g
console.log(reg)
复制代码构造函数

这种方法比字面量麻烦,它的pattern为字符串,比起字面量的方式的优势在于可以动态的拼接

// 注意的一点是字面量里面写一个\, 这里要写两个\
let reg = new RegExp(’\d’, ‘g’)
console.log(reg)
复制代码js里与正则相关的函数

函数
参数
返回

exec(arg1);
arg1: 字符串
Array

test(arg1);
arg1: 字符串
Boolean

replace(arg1, arg2)
arg1: 正则 或者 字符串 , arg2: 字符串 或 回调函数
String

下面是这三个函数使用的简单例子
let reg = /\d/g
console.log(reg.test(‘123abc’))
console.log(reg.exec(‘123tgb’))
console.log(‘123gb’.replace(reg, ‘a’))
复制代码正则里面的括号
大括号 {}
正则表达式里面的大括号里面的内容为数字,表示前面的字符要重复多少次,简单的说{}用于设定匹配的长度。 看下面的例子:
// 匹配字符中b重复2到3次x重复2到3次
let reg = /b{2,3}x{2,3}/
console.log(reg.test(‘bbxx’)) // true
console.log(reg.test(‘bbx’)) // flase
// 字符串中b的重复次数必须大于等于2才能被匹配
let reg1 = /b{2,}/
复制代码中括号 []
中括号[]里的内容组成一个字符范围,只要目标字符串出现在其中就可以了,看下面的例子:
let reg = /b[143hg]b/
reg.test(‘b3b’) // true, 3存在于143hg
reg.test(‘b143hgb’) // false, 匹配模式为bxb x=1 或者 x = 3, x = 4, x = h, x=g
复制代码小括号 ()
小括号()常用于正则分组, 如下图:

https://www.jianshu.com/p/65f42bd316bb
https://www.jianshu.com/p/205c601a5949
https://www.jianshu.com/p/3dee4e87a2da
https://www.jianshu.com/p/027d6c6540ac

javascript约定组名的方式如上图,下面看下例子加深你对捕获组的理解:
let reg = /a(\d(\w))/
// 用KaTeX parse error: Expected 'EOF', got '&' at position 1: &̲(可以理解为0组),替换reg…&’)) // fa5baf
// 用$1(第一组),替换reg匹配的内容
console.log(“fa5baf”.replace(reg, ‘$1’)) // f5baf
// 用$1(第一组),替换reg匹配的内容
console.log(“fa5baf”.replace(reg, ‘$2’)) // fbaf
复制代码小括号搭配|也能当中括号用,看下面的例子:
let reg = /b[143hg]b/
let reg1 = /b(1|4|3|h|g)b/
// reg 和 reg1的效果一样。() 搭配 | 组成匹配集合
复制代码常见元字符

代码
解释

.
匹配除换行符(\n, \r)以外的任意字符

\w
匹配字母或数字或下划线

\W
匹配任意不是字母,数字,下划线,汉字的字符

\s
匹配任意的空白符

\S
匹配任意不是空白符的字符

\d
匹配数字

\D
匹配任意非数字的字符

\b
匹配单词的开始或结束

\B
匹配不是单词开头或结束的位置

^
匹配字符串的开始

$
匹配字符串的结束

|
匹配组里表示或

重复元字符

代码/语法
说明

重复零次或更多次

重复一次或更多次

?
重复零次或一次

{n}
重复n次

{n,}
重复n次或更多次

{n,m}
重复n到m次

贪婪与懒惰

代码/语法
说明

*?
重复任意次,但尽可能少重复

+?
重复1次或更多次,但尽可能少重复

??
重复0次或1次,但尽可能少重复

{n,m}?
重复n到m次,但尽可能少重复

{n,}?
重复n次以上,但尽可能少重复

断言
先行断言

代码/语法
说明
例子

(?=exp)
匹配exp前面的位置
正则: /\b\w+(?=ing\b)/g , 测试字符: I’m singing while you’re dancing. 匹配: sing , danc

(?!exp)
匹配后面跟的不是exp的位置
正则: /\d+(?!%)/ ,测试字符: ‘that’s all 44 of them’ 匹配: 44

后行断言

代码/语法
说明

(?<=exp)
匹配exp后面的位置

(?<!exp)
匹配前面不是exp的位置

实用的例子
// 1. 金额格式化
let val = 1234143141.431
parseFloat(val).toFixed(2)
.toString()
.replace(/\B(?=(\d{3})+(?!\d))/g, ‘,’)

发布了60 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/a59612/article/details/104348349