正则、捕获组、断言、常用正则

正则表达式

初步认识

        let str = "会涉8及12758星际 378少_女ad09nj5n"
        console.log( fn (str) )

        function fn(str){
            let arr = []   // arr接收s传来的数据
            let s = ""     // 相当于符合条件数据的暂存站
            for (let i=0;i<str.length;i++){   //  遍历字符串str
                let thischar = str[i]        
                if(isNaN(thischar)){         // 若当前数据为非数字,则为true,否则为false
                    s && arr.push(s)      // s 存在,将s传入数组arr
                    s = ""                // s传入后,将s清空
                } else {
                    s = thischar            // 将当前数据赋值给s 
                    s && arr.push(s)       // 传入数组
                }
            }              
            return(arr)
        }					// 打印 ["8", "8", "1", "2", "7", "5", "8", "8", " ", "3", "7", "8", "8", "0", "9", "9", "5", "5"]

        // 以上代码可简化为
        // function fn (){
        //     return str.match(/\d/g)
        // }

        let str = "会涉8及12758星际 378少_女ad09nj5n"
        console.log( fn (str) )

        function fn(str){
            let arr = []   // arr接收s传来的数据
            let s = ""     // 相当于符合条件数据的暂存站
            for (let i=0;i<str.length;i++){   //  遍历字符串str
                let thischar = str[i]        
                if(isNaN(thischar)){         // 若当前数据为非数字,则为true,否则为false
                    s && arr.push(s)      // s 存在,将s传入数组arr
                    s = ""                // s传入后,将s清空
                } else {
                    s += thischar            // 将当前数据赋值给s 
                    s && arr.push(s)       // 传入数组
                }
            }              
            return(arr)  // 打印["8", "8", "1", "12", "127", "1275", "12758", "12758", " ", " 3", " 37", " 378", " 378", "0", "09", "09", "5", "5"]
        }
        let str = "会涉8及12758星际 378少_女ad09nj5n"
        console.log( fn (str) )

        function fn(str){
            let arr = []   // arr接收s传来的数据
            let s = ""     // 相当于符合条件数据的暂存站
            for (let i=0;i<str.length;i++){   //  遍历字符串str
                let thischar = str[i]        
                if(isNaN(thischar)){         // 若当前数据为非数字,则为true,否则为false
                    s && arr.push(s)      // s 存在,将s传入数组arr
                    s = ""                // s传入后,将s清空
                } else {
                    s += thischar            // 将当前数据赋值给s 
                }
            }
            s && arr.push(s)       // 传入数组
            return(arr)    // 打印 ["8", "12758", " 378", "09", "5"]
        }

        // 以上代码可简化为
        // function fn (){
        //     return str.match(/\d+/g)
        // }
1、转义符号—\

所有的ASCII都可以用转义字符+数字(一般都是八进制数字)来表示,之所以称之为转义,是因为加上转移字符后,其意义与加之前的意义不同。

正则表达式中的特殊符号:/、\、{、}、+、?、*、(、)、[、]、^、$、|、. ,这些字符在匹配时,要加转义符

转义字符描述
.匹配所有字符,除\n、\r
\a响铃
\b单词边界(起止位置,汉字自带边界,不用加)
\B非单词边界
\f换页
\n换行
\r回车
\t制表符(table键)
\v垂直制表符
转义符 \反斜线字符“\”
转义符 "一个双引号
转义符 ’一个单引号
?问号
\0空字符NULL
\w字母、数字、下划线字符
\W非字母、数字、下划线字符
\d单个数字字符
\D非数字字符
\s空白字符(空格、制表、回车、换行、垂直换行、换页)
\S非空白字符(非空格、制表、回车、换行、垂直换行、换页))
\xxx以八进制数xxx规定的字符
\xdd以十六进制dd规定的字符
\uxxxx以十六进制xxxx规定的Unicod字符
        let r = new RegExp("admin")  // 等同于  let r = /admin/  RegExp对象:正则表达式,用于字符串模式匹配
        let s = "djnsadmindjsk"
        console.log( r.test(s) );  // true  检测字符串s中有无r,结果为布尔值
二、量词
量词描述
n+匹配任何包含至少一个n的字符串,相当于 n{1,}
n*任何包含零个或多个n的字符串, 相当于 n{0,}
n?任何包含零个或一个n的字符串 ,相当于 n{0,1},当不确定n有无时,用?。
n{x}包含x个n的序列的字符串
n{x,y}包含至少x个,至多y个n的序列的字符串
n{x,}包含至少x个n的序列的字符串
$结束字符
^开始字符
?=n匹配任何其后紧跟指定字符n的字符串
?!n匹配任何其后没有紧跟指定字符n的字符串
        // 代码一
        let str = "17847632987"
        let reg1 = /\d{11}/g    // 全局匹配11位数字
        console.log(str.match(reg1));
        // 打印 ["17847632987", index: 0, input: "17847632987", groups: undefined]0: "17847632987"groups: undefinedindex: 0input: "17847632987"length: 1__proto__: Array(0)
        let reg2 = /\d{12}/g      // 全局匹配11位数字
        console.log(str.match(reg2));    // null

        // 代码二
        let str = "abd1637ks790"
        let reg = /\d{1,7}/g   // 匹配至少一位,至多七位数字,且是连续的
        console.log(str.match(reg));
        // ["1637", index: 3, input: "abd1637ks790", groups: undefined]0: "1637"groups: undefinedindex: 3input: "abd1637ks790"length: 1__proto__: Array(0)

        // 代码三
        let str = "ahsbjsnjs"
        let reg = /[d]{0,1}/g       // ""
        // let reg = /ahsbjd?snjs/g    // "ahsbjsnjs"
        console.log(str.match(reg)); 

        // 代码四
        let str = "ahsbjsnjs"
        // let reg = /^sbjs$/g       // null
        let reg = /^ahsbjsnjs$/g    // "ahsbjsnjs"
        console.log(str.match(reg));
三、常用方法
方法描述
testreg.test(str) 从字符串str中匹配 reg,有则为true,无为false
matchstr.match(reg) 从字符串str中匹配reg,有则返回匹配完的数据,无则为null
replacestr.replace(reg,replacestr) 替换正则匹配成功的字段
split分割字符串
        let str = "两只老虎,两只老虎,跑得快"
        let reg = /老虎/g
        let newStr = str.replace(reg, "老鼠")
        console.log(newStr);                    // 两只老鼠,两只老鼠,跑得快

        // 脏字过滤
        let str = "笨蛋,傻逼,恶心,你好"
        let reg = /傻逼|尼玛|垃圾|废物|恶心|笨蛋/g
        let newStr = str.replace(reg,"**")
        console.log(newStr);                // **,**,**,你好

        // 脏字过滤,根据字数来确定*个数
        let str = "笨蛋,傻逼,恶心,你好,草,你大爷"
        let reg = /傻逼|尼玛|垃圾|废物|恶心|笨蛋|草|你大爷/g
        let newStr = str.replace(reg, (a) => {
            // 多个形参
            // 第一个形参:每次匹配的整体内容
            // 第二个形参:第一个子项
            // 第三个形参:第二个子项
            return "*".replace(a.length)
        })
        console.log(newStr);                // **,**,**,你好,*,***
        let str = "属性1加上2新技术3肯定4"
        let newStr = str.split(/\d+/)
        console.log(newStr);   ["属性", "加上", "新技术", "肯定", ""]
四、修饰符
修饰符描述
i不区分大小写匹配
g全局匹配
m换行匹配
五、方括号意义(在方括号中,-和转义符、. 、[、]有特殊意义)
表达式描述
[abc]查找方括号内的任意字符,查找a或b或c
[^abc]查找任何不在方括号内的字符,如查找d或e
[0-9]匹配数字0到9
[a-z]匹配小写字母a到z
[A-Z]匹配大写字母A到Z
[A-z]匹配大写字母A到小写字母z,ASCII英文字母是从大写开始的
(sky|blue)匹配指定选项,匹配sky或者blue
        // 代码五
        let str = "ahsbjsnjs"
        // let reg = /[a-k]/g    // ["a", "h", "b", "j", "j"]
        // let reg = /[A-K]/g    // null
        // let reg = /[A-K]/ig      // ["a", "h", "b", "j", "j"]
        let reg = /[A-K]/i       // ["a", index: 0, input: "ahsbjsnjs", groups: undefined]
        console.log(str.match(reg)); 

        // 代码六
        let str = "0482736119734518ajsn"
        // let reg = /[1-9]\d{4,10}/g       //["48273611973", index: 0, input: "482736119734518", groups: undefined]  第一位是1到9任意一个,其后是至少4个,至多10个数字
        // let reg = /^[1-9]\d{4,10}$/g       // null
        // let reg = /[3-7]/g                   //  ["4", "7", "3", "6", "7", "3", "4", "5"]
        // let reg = /[1-5]+/g               // ["4", "2", "3", "11", "3451"]
        // let reg = /[^\d]/g                   // ["a", "j", "s", "n"]
        // let reg = /[^\d]+/g                  //  ["ajsn"]
        // let reg = /[891]ajsn/g                // ["8ajsn"]  8或9或1的任意一个
        let reg = /[391]ajsn/g                // null
        console.log(str.match(reg)); 

        // 代码七
        let str = "abcd\n\r\t"
        // let reg = /abc|d/g            // ["abc", "d"]  匹配abc或者d
        // let reg = /ab(c|d)/g          // ["abc"]
        // let reg = /ab(d|c)/g          // ["abc"]
        // let reg = /ab(c|d)/          //  ["abc", "c", index: 0, input: "abcd", groups: undefined]
        let reg = /./g                  // ["a", "b", "c", "d", " "]  . 不匹配\n、\r
        console.log(str.match(reg)); 
六、子项和捕获组(\+数字,代表对子项的重复)
        // 代码八
        let str = "abcdjcjabckc"
        let reg = /abc+/g                // ["abc", "abc"]        无
        // let reg = /(abc)+/g               // ["abc", "abc"]      abc
        console.log(str.match(reg));  
        console.dir(RegExp.$1)

        // 代码九
        let str = "123321"
        // let reg = /(\d{3}){2}/g                // ["123321"] 量词是把正则规则重复
        let reg = /(\d{3})\1/g                     // null
        console.log(str.match(reg));
        let str = "123123"
        let reg = /(\d{3})\1/g                     // ["123123"] 捕获组是把匹配结果重复
        console.log(str.match(reg));

        // 代码十
        let str = "2020-12-27"
        let reg = /(\d{4})-(\d{2}-(\d\d))/g                // ["2020-12-27"],捕获组分为普通捕获组和命名捕获组。一般是指普通捕获组,捕获组就是把正则表达式中子项匹配的内容,保存到内存中以数字编号或显式命名的组里,方便后面引用。此处 (\d{4})-(\d{2}-(\d\d)) 编号为0,(\d{4})编号为1,(\d{2}-(\d\d))编号为2,(\d\d)编号为3
        console.log(str.match(reg));

		// 代码十一
        let str = "123sjzaj321"
        let reg = /(\d{3})sjzaj(\d{3})/   //会将子项分离出来,并编码
        console.log(str.match(reg));  
        // (3) ["123sjzaj321", "123", "321", index: 0, input: "123sjzaj321", groups: undefined]0: "123sjzaj321"1: "123"2: "321"groups: undefinedindex: 0input: "123sjzaj321"length: 3__proto__: Array(0)
        console.log(RegExp.$1);      // 123
        console.log(RegExp.$2);      // 321

		// 代码十二
        let str = "123sjzaj123"
        let reg = /(\d{3})sjzaj\1/   // \1被称为捕获组,将前面一个子项重复一遍
        console.log(str.match(reg));  
        // (3) ["123sjzaj321", "123", "123", index: 0, input: "123sjzaj123", groups: undefined]0: "123sjzaj123"1: "123"2: "123"groups: undefinedindex: 0input: "123sjzaj123"length: 3__proto__: Array(0)
七、断言(想要匹配某个规则,但不想结果有这个规则)
1.正向断言
        // let str = "windows2000"          // 只匹配windows后为2000的字符串 ["windows"]结果不带2000,且无子项
        let str = "windows98"               // null
        let reg = /windows(?=2000)/         
        console.log(str.match(reg));

        // let str = "winows2000"          // null
        let str = "windows98"               // 匹配windows后不为2000的字符串  ["windows"]
        let reg = /windows(?!2000)/         
        console.log(str.match(reg));
        let str = "我98岁"
        // let reg = /我(?=98岁)/g                 // 才没有98岁
        let reg = /(?=98)/g                       // 我才没有98岁
        console.log(str.replace (reg,"才没有"))
2.反向断言
        let str = "1919"
        let reg = /(?<=19)19/              // ["19"]
        console.log(str.match(reg));

        // let str = "2119"         // ["19"]
        let str = "2019"            // null
        // let str = "1919"            // ["19"]
        let reg = /(?<!20)19/
        console.log(str.match(reg));
八、常用正则
        let reg = {
            // 匹配整段内容都要加起止符
            // QQ  5-10位数字,不可以0开头
            qq: /^[1-9]\d{4-9}$/,
            // 用户名 数字、字母、下划线,长度一般为6-12,不以数字开头.当规定要有两种字符时,可先判断是否有两种字符,再根据正则匹配,或者用 | 来一直写,可读性不高
            user: /^[a-z_]\w{5,11}$/i,
            // 密码  8-16位,数字、字母、特殊字符除\外
            password: /^[\w<>,?/:;|!@#$%&*()+"'{}\[\]\.\-]{8,16}$/,
            //  手机号 11位  第一位是1,第二位不能是0、1和2,
            tel: /^1[3-9]\d{9}$/,
            // 邮箱   ...@xx.com.cn
            email: /^\w+@[a-z0-9]+(\.[a-z]{2,}){1,2}$/i  
        }
        
        // 密码满足规则判断
        if(/^\d+$/.test(str)){
            console.log("密码不能为纯数字");
        } else if(/^[a-z]$/i.test(str)) {
            console.log("密码不能为纯字母");
        } else if(reg.password.test(str)){
            console.log("满足规则");
        } else {
            console.log("不满足规则");
        }        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值