第六章---正则表达式

字面量正则表达式

格式

    var reg=/a/gi;
    /正则表达式内容/修饰符
    
    两种创建方式:
	var reg=new RegExp("a","g");
    var reg=new RegExp("正则表达式内容","修饰符")

修饰符

g  全局匹配   查找到一个时没有完成,继续向后查找
i  不区分大小写  查找过程中不区分大小
m  多行查找

使用方法

reg.exec(字符串)

在字符串中查找是否包含该正则表达式内容,如果没有找到返回null,
否则返回一个数组,数组中的第0项就是查找到内容,群组,查找到的下标,原字符串
使用g全局匹配无效

reg.test(字符串)

判断字符串是否有满足正则表达式的内容,如果有,则返回true,否则返回false

字符串可以使用正则表达式的方法

match replace search split

元字符
组成正则表达式的基本符号叫做元字符
正常的元字符包含普通的字符和一些转义字符及特殊用途的符号

当使用到一些字符符号与正则表达式中的符号冲突是,需要将其转换为字符符号作用不使用正则符号含义,这是需要使用转义字符,\符号。例如( ) [ ] { } \ / ^ * .

通配符 . 统配任意一个字符(仅一个)

test 和 exec都是这种情况,前提条件是同一个正则表达式

   var reg=/a/;   
   console.log(reg.exec("abac"));//0
   console.log(reg.exec("abac"));//0
   console.log(reg.exec("abac"));//0

var reg=/a/g; 如果使用了全局匹配,多次查找会在上次的基础上继续向后

   console.log(reg.exec("abac"));//0
   console.log(reg.exec("abac"));//2
   console.log(reg.exec("abac"));//null

每次都是新的正则表达式不会有上面的情况出现

   console.log(/a/g.test("abac"))
   console.log(/a/g.test("abac"))
   console.log(/a/g.test("abac"))

[] []中的内容代表任意一个字符
[.] 就是. 不是通配符

字符类的反义 不要什么什么内容,取什么内容以外的东西
[^a] 匹配所有除了a以外的字符
[^.] 匹配除了.之外的所有字符
[^.^] 匹配除了.和^字符以外的其他字符
[^_^] 匹配除了_和^字符以外的其他字符
[^\^] 除了^以外的所有字符
[a-z^o] a-z^ 当^ 出现的位置如果不是[]的第一位,^ 恢复为^字符而不是反义

\w [a-zA-Z0-9_]
\W [^a-zA-Z0-9_]
\d [0-9]
\D [^0-9]
\s 空白字符
\S 除了空白字符以外的字符

例题
删除空字符

  var str="aa asjd  jsadkjasd  daskj asdjadj askjdaskjd asj dadsk ";
  str=str.replace(/\s/g,"");
  console.log(str)
  console.log(str.split(/\s/).join(""))
  console.log(str.match(/\S/g).join(""))

重复

/a{3}/ a重复3次
/(ab){3}/ ab一共重复3次
/a{1}/ 等同于a
/z{0}/ 匹配空字符 “” 任意字符串中的"" 数量是字符串长度+1

重复范围

/a{1,5}/ 最小几次到最大几次的重复
/a{0,5}/ 最小是最后一个空字符,最大是5个
/a{1,}/ 当最大值不填写时,表示不设上限,最大无限,至少要有一个该字符
/a{0,}/ 有没有这个字符都可以,也可以重复无限次

* /a{0,}/ 有没有都行,可以重复无限次
+ /a{1,}/ 至少要有一个,可以重复无限次
? /a{0,1}/ 有没有都可以

非贪婪匹配 .*? .+?

用在两个符号之间使用 .*? 或者.+? 可以获取到最近的这两个符号之间的内容

选择匹配

|
/ab|bc/
/abc|bcd|def/
/a|b/ /[ab]/
/ab||bc/

|| 表示或者了一个""

起始符和结束符
^ $

起始和结束符,可以约束起始后或者结束前的内容,也可以约束整个字符串的长度

去除首尾空格

trim();

群组

()
当在正则表达式中使用群组()时,使用match不使用g的前提下,可以获取到被查找到所有内容以外,包括每个()

str.replace(/\《.+?\》/g,function(被查找到的每一个内容,索引下标,原字符串){
            console.log(t,i,s)
        })

  str.replace(/\《(.+?)\》/g,function(被查找到的每一个内容,这个内容所包含的群组1,这个内容所包含的群组2,...,索引下标,原字符串){
            console.log(t,$1,i,s)
        })
// console.log("abcd".match(/^(a)(bc)(d)$/))
// console.log("《西游记》《红楼梦》《水浒》《三国演义》是中国四大名著".match(/\《(.+?)\》/g))
var str="《西游记》《红楼梦》《水浒》《三国演义》是中国四大名著";

str.replace(/\《(.+?)\》/g,function(t,i,s){
    console.log(t,i,s)
})

例题 替换手机号中间****

 var str="18656467892";
        // str=str.replace(/^(\d{3})\d{4}(\d{4})$/,function(t,$1,$2){
        //     return $1+"****"+$2;
        // })
        str=str.replace(/^(\d{3})\d{4}(\d{4})$/,"$1****$2");
        console.log(str)

断言

断言 基于群组的基础完成的判断
/内容(?=条件)/ 后置肯定断言
/内容(?!条件)/ 后置否定断言
/(?<=条件)内容/ 前置肯定断言
/(?<!条件)内容/ 前置否定断言
例题

var str="a1ata2";
        // console.log(str.replace(/a(?=[a-zA-Z])/g,"0"))
        console.log(str.replace(/a(?![a-zA-Z])/g,"0"))
        // var str="abcbdb";
        // console.log(str.replace(/(?<=c)b/g,"0"))
        // console.log(str.replace(/(?<!c)b/g,"0"))
        
var str="《西游记》《红楼梦》《水浒》《三国演义》是中国四大名著";
        console.log(str.match(/(?<=\《).*?(?=\》)/g))

/^(?=\D+\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,16}$/    

重复判断
(内容)\1* 可以有不重复的
(内容)\1+ 至少重复一次以上的

面试题 obj重复字符的数量


var obj={
            a:"asdasdasd",
            b:"qiweqwiuasnscsak",
            c:"alksdjaskldjq laksjdlajsd",
            d:"opqpwoidpowdkop  alksjdlaks  lkasjdlkasjd "
        };
    //======low b 写法
        // var str="";
        // for(var key in obj){
        //     str+=obj[key];
        // }
        // var arr=str.split("");
        // arr.sort();
        // str=arr.join("");
        // var arr1=str.match(/(\w)\1*/g);
        // console.log(arr1)
        // var s="";
        // for(var i=0;i<arr1.length;i++){
        //     s+=arr1[i][0]+"{"+arr1[i].length+"}";
        // }
        // console.log(s)

//=======不low写法
 function parse(obj){
                return Object.values(obj).join("").split("").sort().join("").match(/(\w)\1*/g).reduce(function(v,t){
                        return v+t[0]+"{"+t.length+"}";
                },"")
            }

           var s=parse(obj);
           console.log(s)
var arr=["i love javascript","javascript is good language","i want to study javascript"];
        console.log(arr.join(" ").split(/\s+/).sort().join(" ").match(/((?<=\s+)javascript(?=\s+)|(?<=\s+)i(?=\s+))\1*/g))
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

轩逸客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值