正则表达式

前言

正则表达式功能强大,但很难测试,史上著名的几个宕机事故是由于正则表达式引起的:

所以使用的时候一点要谨慎。

基本语法

匹配u

/u/

匹配1333或2333

/1333|2333/
/(1|2)333/

匹配abc,并且被匹配的字符串要求以a开头,以c结尾

/^abc$/

例如: babcb 不能匹配成功,虽然含有abc,但是整个字符串不是以a开头,不是以c结尾

元字符

元字符只代表一个字符

\d 数字
\D 除了数字
\s 空白 不光是空格,而是所有看不见的字符
\S 除了空白
\w 字母数字下划线
\W 除了字母数字下划线
. 除了换行的任意字符

原子表

[]表示匹配[]中的一个字符。

匹配a或u或@

/[au@]/

[]中第一个字符为^表示匹配除了。匹配除了a或u或@之外的字符

/[^au@]/

元字符\d表示数字 ,\D表示非数字,[\d\D]在数字和非数字中取一个字符,就是匹配任意字符。

同理,下面都表示匹配任意字符

/[\d\D]/
/[\s\S]/
/[\w\W]/

[]中的-的用法

/[0-9]/    0到9中的任意一个字符
/[a-z]/     a到z中的任意一个字符
/[A-Z]/   A到Z中的任意一个字符

量词

{n} n个
{n,} n~无穷个
{n,m} n~m个
* 0 次或多次。等价于 {0,}
+ 1 次或者多次。等价于 {1,}
? 0 次或者 1 次。等价于 {0,1}

量词默认是贪婪的,就是尽可能匹配多个。量词后面跟?禁止贪婪。

模式

i 不区分大小写
g 匹配全部符合条件的
m 每一行单独匹配

原子组

()可以把括号中的内容单独存起来。

let hd = `<h1>aaaaaaa</h1>
<h2>bbbbbbb</h2>
`
let reg = /<(h[1-6])>([\s\S]*)<\/\1>/gi

for (const item of hd.matchAll(reg)){
	console.log(item)
}

image

正则表达式中,可以用\1,\2,\3,...表示第1个原子组、第2个原子组、第2个原子组...

出现原子组套原子组的情况,从左到右数,先碰到哪个哪个排前面

?:可以取消原子组的记录

let hd = `
https://www.houdunren.com
http://houdunwang.org
https://hdcms.com
`
let reg = /https?:\/\/((?:\w+\.)?\w+\.(?:com|org|cn))/gi

for (const item of hd.matchAll(reg)){
	console.log(item)
}

image

禁止贪婪

量词默认是贪婪的,就是尽可能匹配多个。量词后面跟?禁止贪婪。

下面这个例子中,贪婪与不贪婪,结果完全不一样

let hd = `
<span>aaaaaa</span>
<span>bbbbb</span>
<span>cccccc</span>
`
let reg = /<span>([\s\S]+?)<\/span>/gi


console.log(hd.match(reg))

matchAll()和exec()

全局模式下,用match函数就获取不到原子组了,此时可以使用matchAll(),或exec()

例如对于如下正则表达式:

let hd = `
https://www.houdunren.com
http://houdunwang.org
https://hdcms.com
`
let reg = /https?:\/\/((?:\w+\.)?\w+\.(?:com|org|cn))/gi

使用exec()

while(res = reg.exec(hd)){
	console.log(res)
}

使用matchAll()

for (const item of hd.matchAll(reg)){
	console.log(item)
}

replace()

let hd = `<h1>abbbbbbbb</h1>
<span>1111111111</span>
<h2>cddddddd</h2>
`
let reg = /<(h[1-6])>(\w([\s\S]*))<\/\1>/gi
hd.replace(reg,(p0,p1,p2,p3)=>{
	console.log(p1,p2,p3)
})

replace函数,$1、$2、$3、...可以表示第1个原子组、第2个原子组、第2个原子组、

let hd = `<h1>sldfjalsfj</h1>
<span>1111111111</span>
<h2>aaaaaaa</h2>
`
let reg = /<(h[1-6])>([\s\S]*)<\/\1>/gi
console.log(hd.replace(reg,`$2`))

replace第二个参数为函数时,函数接收的参数为原子组

let hd = `<h1>abbbbbbbb</h1>
<span>1111111111</span>
<h2>cddddddd</h2>
`
let reg = /<(h[1-6])>(\w([\s\S]*))<\/\1>/gi
hd.replace(reg,(p0,p1,p2,p3)=>{
	console.log(p1,p2,p3)
})

image

转义问题

posted @ 2024/12/18 21:00:16