如何使用正则命令

关于正则的基本知识点都在下面的代码中,每个知识点都有对应的案例。我也是跟着B站上"后盾人教程"学的。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 
        知识点:
        关于全局匹配获取括号里的内容,可以用match(while+i模式(仅仅是忽略大小写的作用)),matchAll(g模式),exec(gi模式),replace(gi模式)
        模式 :g(全局匹配) i(忽略大小写) s(忽略换行符) m(每一行单独处理) y(找不到停止)
     -->
    <!-- 3. -->
    <!-- <div class="content">
        dsfajoaewjf.com
    </div> -->
     <!-- 18.操作dom -->
        <!-- <h2>xxxxx</h2>
        <h3>xxxxxxxx</h3>
        <H4>xxxxxxxxxx</H4>
        <h3>
            xxxxxxxxx
        </h3> -->
        <!--20.验证邮箱  -->
        <!-- <input type="text" value="xxxxxx" name="email"/><span class="isEmail"></span> -->
        <!-- 21.dom替换 -->
        <!-- <div class="content">
            <h2>aBCDEFG</h2>
            <h3>bbcdefg</h3>
            <p>cBCDEFG</p>
        </div> -->

        <!-- 23.使用多个正则验证密码 -->
        <!-- <input type="text" name="password"/><span class="emailErrTxt"></span> -->

        <!-- 24.禁止贪婪匹配 -->
        <!-- <div class="content">
            <span>joadsjfoad</span>
            <span>fajodfjoadf</span>
        </div> -->

        <!-- 28.使用$&添加链接 -->
        <!-- <div class="content">
            有问题找百度,百度一下就知道!
        </div> -->

        <!-- 30.批量按需替换链接 -->
        <!-- <div class="content">
            <a style="color:red" href="http://www.hdcms.com">
                开源系统
            </a>
            <a id='l1' href="http://houduren.com">后盾人</a>
            <a href="http://yahoo.com">雅虎</a>
            <h4>http://www.hdcms.com</h4>
        </div> -->

        <!-- 32.给组起别名,细节结果中的groups中就会有内容了 -->
        <!-- <div class="content">
            <a href='http://www.baidu.com'>百度</a>
            <a href="http://www.sina.com">新浪</a>
        </div> -->

        <!-- 34.?<=断言匹配,前面是什么 -->
        <!-- <div class="content">
            <a href="https://www.baidu.com">链接1</a>
            <a href="https://yahoo.com">链接2</a>
        </div> -->
        <!-- 37.断言匹配限制用户关键词 -->
        <!-- <input type="text" name="username"/> -->

        <!-- 38.?<!前面不是什么 -->
        <!-- <div class="content">
            <a href="https://www.houdunren.com/1.jpg">1.jpg</a>
            <a href="https//oss.houdunren.com/2.jpg">2.jpg</a>
            <a href="https://cdn.houdunren.com/3.jpg">3.jpg</a>
            <a href="https://houdunren.com/4.jpg">后盾人</a>
        </div> -->
    <script>
        //1.
        // let str="adsfadwf56dsfa432432"
        // let nstr=[...str].filter(v=>!isNaN(v)).join("")
        //正则
        // console.log(str.match(/\d/g).join(""))


        //2.
        //正则表达式字面量的写法读取变量,但是可以配合eval
        // let str="un.com"
        // let reg="u"
        // console.log(eval(`/${reg}/`).test(str))

        //3.
        // let s=prompt('请输入想要找的字符,支持正则')
        // let contentDiv=document.querySelector('.content')
        // let reg=new RegExp(s,'g')
        // contentDiv.innerHTML=contentDiv.innerHTML.replace(reg,search=>{
        //     return `<span style="color:red">${search}</span>`
        // })

        //4.
        // let num="010-9999999";
        // console.log(/^(010|020)\-\d{7,8}$/.test(num)) 
        
        //5.[],()
        // let str=222254535;
        // let reg=/[123]/
        // let reg=/(12|31)/
        // console.log(reg.test(str))   
        
        //6.转义字符\
        // let num=23.12
        // console.log(/\d+\.+\d+/.test(num))
        // //字符串"\d"=>"d" "\\d"=>"\d"
        // let reg=new RegExp("\\d+\\.\\d+")
        // console.log(reg.test(num))
        // let url="http://www.baidu.com"
        // \/是因为/代表正则里的结束字符
        // console.log(/https?:\/\/\w+\.\w+\.\w+/.test(url))

        //7.
        // let str=`
        //     张三:010-888999,李四:020-64545654
        // `
        // //获取张三,李四
        // console.log(str.match(/[^\-,\s\d:]+/g))

        //8.
        // let str='32432434@qq.com'
        // console.log(/^\w+@\w+\.\w+$/.test(str))

        //9.
        // let str=`
        //     hou.com
        //     hannda.com
        // `
        // s模式视为单行匹配,可以理解为忽略换行符
        // console.log(str.match(/.+/s)[0])

        //10.
        //  let str=`
        //    <span>
        //     hou.com
        //     hannda.com
        //     </span>
        // `
        //这里的+得加,不加只能匹配一个,加上的话可以贪婪匹配
        // console.log(/<span>[\d\D]+<\/span>/.test(str))

        //11.
        // let hd="hasdfuaUsU"
        // //g全局匹配,i不区分大小写
        // console.log(hd.match(/u/gi))
        // console.log(hd.replace(/u/gi,'@'))
        
        //12.
        // let str=`
        // #1 js,200元 #
        // #2 php,200元 #
        // #9 houdunren.com # 后盾人
        // #3 node.js,180元 #
        // `
        // m 每一行单独处理
        // let lesson=str.match(/^\s+#\d\s+.+\s+#$/gm).map(v=>{
        //     v=v.replace(/\s+#\d\s+/,'').replace(/\s+#/,'')
        //     let [name,price]=v.trim().split(',')
        //     return {name,price}
        // })
        // console.log(lesson)

        //13.
        // let str='hjouun'
        // 这里什么都不加的话,下面while循环中的lastIndex一直为0 导致死循环
        // let reg=/u/g
        // while((res=reg.exec(str))){
        //     console.log(reg.lastIndex)
        //     console.log(res)
        // }
        
        //14.
        //y模式 如果在lastIndex处匹配不到,会停止,但是可以修改reg的lastIndex属性 y模式会提高检索的效率,找不到就停,不再往下找了
        // let str='xx23434543,345345345,0000000xxxxxxx'
        //加了问号,可以查两次结果
        // let reg=/(\d+),?/y
        // reg.lastIndex=2;
        // let num=[]
        // while(res=reg.exec(str)) num.push(res[1])
        // console.log(num) 
        
        
        //15,
        //可以把选取的内容放在()里,然后后面使用\1代表选取和前面()一样的内容
        // let str="2021-08/03"//false
        // let str="2021-08-03"//true
        // 这里的\1代表的内容和([-\/])的内容一样
        // let reg=/\d{4}([-\/])\d{2}\1\d{2}/
        // console.log(reg.test(str))

        //16.
        //字符是有自己特定的属性的,可以根据这个选取特定的字符 比如文字sc=Han 用这个匹配时,要加上u模式
        // let str="战三:020-35345435,王思:010-3435345"
        //获取里面的文字
        // console.log(str.match(/[^\-\d:,]+/g))
        // console.log(str.match(/\p{sc=Han}+/gu))   
        
        
        //17.
        //[.+] 中的.+没有特殊含义 原子表字符不解析

        //18.正则操作DOM
        // let body=document.querySelector('body')
        //[\d\D] [\s\S] [^] 代表所有都可以匹配
        //这里用+的话 <h1></h1>就匹配不到了。。
        // body.innerHTML=body.innerHTML.replace(/<(h\d)>[^]*<\/\1>/gi,'')    
        
        
        //19.
        //原子组()的其它知识
        // let str=`
        //     <h1>xxxxxxxxx</h1>
        //     <h2>xxxxxxx</h2>
        // `
        // let reg=/<(h[1-6])>([^]+)<\/\1>/i
        //使用字符串的match匹配时,g模式和i模式输出的结果不一样,i模式输出的全一些,而且可以把原子组里面的内容输出 索引1的内容就是第一个原子组里面的内容 
        // console.log(str.match(reg))

        //20.验证邮箱
        // let input=document.querySelector("input[name='email']")
        // let span=document.querySelector('.isEmail')
        //因为可以是.com.cn 所以这里得用原子组包起来 要不然只会识别.com的情况    
        // let reg=/^[\w-]+\@([\w-]+\.)+(com|con|net)$/i
        // input.addEventListener('keyup',function(){
        //     span.innerHTML=reg.test(this.value)?'正确':'错误'
        // })

        //21.DOM替换
        // let div=document.querySelector('.content')
        //这里有三个括号 
        // let reg=/<(h[1-6])>(\w([^]+))<\/\1>/gi
        // console.log(div.innerHTML.replace(reg,`<span>$3</span>`));
        // let res= div.innerHTML.replace(reg,($0,$1,$2,$3)=>{
            // $0匹配到的全部内容 $1取出匹配到的全部内容中的第一个括号中的内容
        //    console.log($0) 
        //    return `<span>${$3}</span>`
        // }) 

        //22.嵌套分组、记录组、不记录组 提取域名
        // let str=`
        // http://houdunren.com
        // https://xxxxx.com
        // `
        //?:代表该组不会记录到组编号中,就是最后不能用$数字获取括号里的内容
        // let reg=/https?:\/\/((?:\w+\.)(?:com|cn|org|con))/ig
        // let arr=[]
        // while(res=reg.exec(str)){
        //     console.log(res);
        //     arr.push(res[1])
        // }

        //23.使用多个正则验证密码
        // let emailInput=document.querySelector("input[name='password']")
        // let span=document.querySelector('.emailErrTxt')
        // let regs=[
        //     {
        //         name:'必须含有特殊字符',
        //         reg:/[^a-z0-9]/i
        //     },
        //     {
        //         name:'必须含有字母',
        //         reg:/[a-z]/i
        //     },
        //     {
        //         name:'必须含有数字',
        //         reg:/[0-9]/
        //     },
        //     {
        //         name:'长度必须是五位以上',
        //         reg:/[^]{5,}/
        //     }
        // ]
        // emailInput.addEventListener('keyup',function(){
        //     span.innerHTML=''
        //     let res=regs.every(v=>{
        //     if(!v.reg.test(this.value)) span.innerHTML=v.name
        //     return v.reg.test(emailInput.value)
        // })
        //     res?span.innerHTML='密码正确':''
        // })

        //24.禁止贪婪匹配 量词后面加上?,可以禁止贪婪匹配
        // let div=document.querySelector('.content')
        //注意([^]*)?是不会禁止贪婪匹配的,因为括号里面的内容还是会往多的取,而?只是匹配括号里的内容为0或1个 说白了就是?加在量词后面可以实现禁止贪婪匹配 
        // let reg=/<span>([^]*)?<\/span>/gi
        // reg=/<span>([^]*?)<\/span>/gi    
        //?本身就是会往1个进行贪婪匹配,这样??写法就可以限制为0个
        // div.innerHTML=div.innerHTML.replace(reg,($0,$1)=>{
        //     return `<h2>${$1}</h2>`
        // })    

        //25.matchAll全局匹配
        // let str=`
        //     <h2>adfadf</h2>
        //     <h2>dafasf</h2>
        //     <h2>afawefdsf</h2>
        // `
        //想要获取括号里的内容,就要去掉g模式,并使用i模式;但是由于去掉了g模式,就不能匹配到所有了,这里就形成了矛盾
        //使用matchAll可以解决这个矛盾
        // let reg=/<(h[1-6])>([^]+?)<\/\1>/g
        // matchAll方法会返回一个关于REGEXP的迭代对象
        // console.log(str.matchAll(reg))
        // let regArr=str.matchAll(reg)
        // let res=[]
        // for(let i of regArr){
        //     res.push(i[2])
        // }

        //26.为兼容低端浏览器,手动实现matchAll
        // String.prototype.matchAll=function(reg){
        //     let res=this.match(reg)
        //     if(!res) return 
        //     //根据res[0]的搜索结果的字符长度个数,用相应个数的'^'进行替换
        //     let str=this.replace(res[0],'^',res[0].length)
        //     //如果匹配不到就给一个[]
        //     let matchRes=str.matchAll(reg) || []
        //     return [res,...matchRes]
        // }
        //这里不用g模式,用i模式,是因为想要得到括号里的内容,我们写的matchAll和原有的matchAll是有区别的
        // let reg=/<(h[1-6])>([^]+?)<\/\1>/i
        // let str=`
        //     <h2>adfadf</h2>
        //     <h2>dafasf</h2>
        //     <h2>afawefdsf</h2>
        // `
        // console.log(str.matchAll(reg))

        //27.使用exec实现全局匹配
        // function search(str,reg){
        //     let result=[]
        //     //reg如果不是g模式的话,这里就会导致死循环
        //     while(res=reg.exec(str)){
        //         result.push(res[2])
        //     }
        //     console.log(result);
        // }
        // let str=`
        //     <H2>adfadf</h2>
        //     <h2>dafasf</h2>
        //     <h2>afawefdsf</h2>
        // `
        //这里使用的是exec进行匹配,不需要使用i模式就可以获取到括号里的内容,这里的i模式只是起到忽略大小写的作用
        //这里如果不加g模式的话,是不会继续往下进行匹配的
        // let reg=/<(h[1-6])>([^]+?)<\/\1>/gi
        // search(str,reg)
        
        //28.$在正则中的使用
        //使用$&,$`,$'将str变为"==内容=="
        // let str="=内容="
        //$&表示匹配到的内容,$`表示匹配到的内容的前面内容,$'表示匹配到的内容的后面内容
        // console.log(str.replace(/内容/,"$`$&$`"))

        //29.使用$&添加链接
        // let div=document.querySelector('.content')
        // div.innerHTML=div.innerHTML.replace(/百度/g,"<a href='http://www.baidu.com'>$&</a>")
        
        //30.批量按需修改链接
        // let div=document.querySelector('.content')
        // let reg=/(<a.*href=['"])(http)(:\/\/)(www\.)?(houduren|hdcms)/gi
        // div.innerHTML=div.innerHTML.replace(reg,(v,...args)=>{
        //    args[1]='https'
        //    //如果这个位置有www.,那么就用原来的,没有就加上www.
        //    args[3]=args[3] || 'www.'
        //    return args.slice(0,5).join('')
        // })

        
        //31.原子组别名的使用
    //    let str=`
    //     <h1>heejofapjsdjf</h1>
    //    ` 
    //    //?<content>定义原子组别名
    //    let reg=/<(h[1-6])>(?<content>.*?)<\/\1>/
    //    //$<content>使用原子组别名     
    //    console.log(str.replace(reg,"<span>$<content></span>"))     
        
        
        //32.给组起别名,细节结果中的groups中就会有内容了
        // let div=document.querySelector('.content')
        // let reg=/<a.*href=(['"])(?<link>.*?)\1>(?<title>.*?)<\/a>/gi
        // let links=[]
        // for(let regItem of div.innerHTML.matchAll(reg)){
        //     links.push(regItem["groups"])
        // }    
           
        //33.?=断言匹配,后面是什么
        //添加.00以规范价格
        // let lessons=`
        //     node.js,300.00元,200次,
        //     html,200元,100次,
        //     java,400元,200次
        // `
        // //注意(?=元)是不会加到组里面的!
        // let reg=/(\d+)(.00)?(?=元)/gi
        // lessons=lessons.replace(reg,(v,...args)=>{
        //     args[1]=args[1] || '.00'
        //     return args.splice(0,2).join('')
        // })

        //34.?<=断言匹配,前面是什么
        // let div=document.querySelector('.content')
        // let reg=/(?<=href=(['"])).+(?=\1)/ig
        // div.innerHTML=div.innerHTML.replace(reg,"https://www.houdunren.com")
            
        
        
       //35.使用断言处理电话号码
    //    let phoneNumber=`
    //    小王:13985647651
    //    小李:13345678983
    //    ` 
    //    let reg=/(?<=\d{7})\d{4}/gi
    //    phoneNumber=phoneNumber.replace(reg,v=>{
    //        return '*'.repeat(4)
    //    })

    //36.使用断言匹配?!,后面不是什么
    // let str='houdunren2010hdcms'
    // //注意$不修饰断言!
    // let reg=/[a-z]+(?!\d+)$/i
    // console.log(str.match(reg))

    //37.断言匹配限制用户关键词
    // let userInput=document.querySelector("input[name='username']")
    // //不能有小明关键字,而且是以字母开头的4位字母   
    // let reg=/^(?!.*小明.*)[a-z]{4}$/
    // userInput.addEventListener("keyup",function(ev){
    //     console.log(this.value.match(reg))
    // })
    
    //38.?<!前面不是什么
    // let contentDiv=document.querySelector('.content')
    //注意.*后面一定要加个?以禁止贪婪匹配,要不然就会取到后面的</a>中的/
    // let reg=/https?:\/\/([a-z]+)?(?<!oss)\..*?(?=\/)/gi
    // contentDiv.innerHTML=contentDiv.innerHTML.replace(reg,(...args)=>{
    //     return 'https://oss.houduren.com'
    // })    
    </script>
</body>
</html>


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值