1. 为什么用正则?#
小例子#
假设有一段字符串
const result="124ssabc33501fs"
现在我只想取里面的数字。如何去做?
当然你肯定会想到这样:
let r1=[...result].filter((item,index)=>!Number.isNAN(item)).join("")
虽然只有一行,但是,还没到最优雅。
如果使用正则
console.log(result.match("/\d/g").join())
即可匹配到所有数字。
创建正则的方式#
字面量创建#
let oo="lhw"
console.log(/w/.test(oo)) //检测是否有w字符
但?如果我的 w 是个变量呢?
let oo="lhw"
const h="h"
console.log(eval(`/${h}/`.test(oo)))
对象创建#
let oo="luhw"
let a="h"
let a2="\\w" //匹配下划线
let a3="\\d" //匹配数字
let reg=new RegExp("u","g") //匹配字串、全局
let reg2=new RegExp(a,"g") //接收变量比字面量方便
reg.test(oo)
小例子#
案例,当用户输入文字时将 div 里对应的文字替换。
<div class="content">lhwwoc</div>
<script>
let content=prompt("请输入内容")
let reg=new RegExp(content,"g")
const element=doucument.qureySelector(".content")
// let str=content.replace(/\w/,str=>{})
element.innerHtml.replace(reg,str=>{
return `<span style="color:red">
${str}
</span>`
})
</script>
选择符#
类似于逻辑||
const str="newnewnwec"
console.log(/@|n/.test()) //true
console.log(/@|o/.test()) //false
console.log(/wne|n/.test()) //true
伏笔#
假设我要检测一个电话号是北京或者是不是上海
/(010|020)\-\d{7,8}}/.test("010-12309721")
//true
/(010|020)\-\d{7,8}}/.test("assd010-12309721")
//false
我们发现开头结尾并没有限制。
接下来会说。
先解释原子表的概念
let reg=/[123456]/
let age="18"
reg.test("1") //true
age.match(reg) //返回[1] //仅匹配一个。
如果将【 】换成 ()
//
let reg=/(18|34|56)/
let age="18"
reg.test("1") //false
age.match(reg) //返回["18","18",index:0]