zl程序教程

您现在的位置是:首页 >  后端

当前栏目

js正则进阶要看懂的代码

JS代码 进阶 正则
2023-09-11 14:20:38 时间
<!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>
    <p>1</p><p>2</p>
    <script>
    //懒惰匹配
        let text = '<p>1</p><p>2</p>';
        let pattern0 = /<p>.*<\/p>/;
        let pattern = /<p>.*?<\/p>/;
        console.log('贪婪匹配',pattern0.exec(text));
        console.log('懒惰匹配',pattern.exec(text));    
    //分组()
    text = "mom and dad and baby";
    pattern = /mom( and dad( and baby))/;
    console.log('分组',pattern.exec(text));  
    //非捕获分组(?:)
    pattern = /mom(?: and dad)( and baby)/;
    console.log('非捕获分组',pattern.exec(text));  
    //分组的回溯引用
    text = '<p>1</p><p>2</p>';
    pattern0 = /<(p)>.*<(\/\1)>.*<\1>.*<\2>/;
    console.log('分组的回溯引用',pattern0.exec(text));
    //命名捕获分组  (?<name>内容) ES9新特性
    //如何访问 exec返回结果有个名为groups的属性,该对象里有我们命名的属性
    text = "mom and dad and baby";
    pattern = /mom(?<dad_baby> and dad(?<baby> and baby))/;
    let result = pattern.exec(text);
    console.log('命名捕获分组',pattern.exec(text));
    console.log(result.groups.dad_baby);
    console.log(result.groups.baby);  
    //正向先行断言 (?=表达式) 指在某个位置向右看,表示所在位置右侧必须能匹配表达式
    text ='我喜欢你 我喜欢 我喜欢我 喜欢 喜欢你';
    pattern = /喜欢(?=你)/g;
    var a;
    console.log('正向先行断言', a=pattern.exec(text),'index',a?.index);
    console.log('正向先行断言',a=pattern.exec(text),'index',a?.index);
    console.log('正向先行断言',a=pattern.exec(text),'index',a?.index);
    //反向先行断言(?!表达式)
    pattern = /喜欢(?!你)/g;
    console.log('反向先行断言', a=pattern.exec(text),'index',a?.index);
    console.log('反向先行断言',a=pattern.exec(text),'index',a?.index);
    console.log('反向先行断言',a=pattern.exec(text),'index',a?.index);
    console.log('反向先行断言',a=pattern.exec(text),'index',a?.index);
    //正向后行断言:(?<=表达式),指在某个位置向左看,表示所在位置左侧必须能匹配表达式
    pattern = /(?<=我)喜欢(?=你)/g;
    console.log('正向后行断言', a=pattern.exec(text),'index',a?.index);
    console.log('正向后行断言',a=pattern.exec(text),'index',a?.index);
    //反向后行断言:(?<!表达式),指在某个位置向左看,表示所在位置左侧不能匹配表达式
    pattern = /(?<!我)喜欢(?!你)/g;
    console.log('反向后行断言', a=pattern.exec(text),'index',a?.index);
    console.log('反向后行断言',a=pattern.exec(text),'index',a?.index);
    //正则扩展:dotAll 模式 ,s代表这个模式
    //dot .  元字符  除换行符以外的任意单个字符
        let str = `
        <ul>
            <li>
                <a>肖生克的救赎</a>
                <p>上映日期: 1994-09-10</p>
            </li>
            <li>
                <a>阿甘正传</a>
                <p>上映日期: 1994-07-06</p>
            </li>
        </ul>`;
        //声明正则
        // const reg = /<li>\s+<a>(.*?)<\/a>\s+<p>(.*?)<\/p>/;
        const reg =   /<li>.*?<a>(.*?)<\/a>.*?<p>(.*?)<\/p>/gs;
        //执行匹配
        // const result = reg.exec(str);
        let result0;
        let data = [];
        while (result0 = reg.exec(str)) {
            data.push({ title: result0[1], time: result0[2] });
        }
        //输出结果
        console.log(data);
        
    //断言高级应用    
    //断言可以用来判断字符串是否符合特定的规则,例如提取包含至少一个大小写字母的至少8位字符串
    pattern = /(?=.*?[a-z])(?=.*?[A-Z]).{8,}/gm;
    pattern0 = /.{8,}(?<=[a-z].*?)(?<=[A-Z].*?)/gm;
    text =`
Admin123456
pZUJLUpTL2
Tnut2eWPN1
wJxpVhVYi3
UySRo49ps
Ig7AHzZ0J
oYHMDdHCK9
yiyWKQnWo2
gTZEEkVrj1
8Ij12340as
wdfqe#wefDdf444
Codejiaonang123
CodeJiaonang@qq1
111111abc11ABc
CodeJiaonang123
qwe
8848
123456
asd123
Adm123
Asd123
wjleif932
admin123
123admin
123asd123
ADMIN123()
编号89757
888888888info
masterxiao123
888888888A
`
    for (let i =0 ;i<16;i++){
        a=pattern.exec(text);
        console.log('规范密码方式一', a?a[0]:'没有了');
    }
    for (let i =0 ;i<16;i++){
        a=pattern0.exec(text);
        console.log('规范密码方式二', a?a[0]:'没有了');
    }
    </script>
</body>
</html>