正则表达式功能强大,但很难测试,史上著名的几个宕机事故是由于正则表达式引起的:
所以使用的时候一点要谨慎。
匹配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)
}
正则表达式中,可以用\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)
}
量词默认是贪婪的,就是尽可能匹配多个。量词后面跟?禁止贪婪。
下面这个例子中,贪婪与不贪婪,结果完全不一样
let hd = `
<span>aaaaaa</span>
<span>bbbbb</span>
<span>cccccc</span>
`
let reg = /<span>([\s\S]+?)<\/span>/gi
console.log(hd.match(reg))
全局模式下,用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)
}
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)
})