正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑,许多程序设计语言都支持利用正则表达式进行字符串操作。主要有两种操作:匹配和捕获 链接描述

正则表达式语法

正则表达式的创建
正则表达式是有元字符和修饰符组成,将元字符和修饰符写在" // "中。
eg: var reg = /d+/g;//意思是在全局中的多个数字

元字符:

  • \: 转义字符
  • ^: 以某一个元字符开始
  • $: 以某一个元字符结束
  • \n: 匹配一个换行
  • ".":除了\n以外的任意字符
  • (): 分组
  • x|y: x或者y中第一个
  • [xyz]:x或者y或者z中的一个
  • [^xyz]:除了三个以外的任意一个字符
  • [a-z]:a 和 z 之间的任意字符
  • [^a-z]:除了a 和 z 之间的任意字符
  • \d:表示 0-9 之间的数字
  • \D:除了0-9之间的数字以外的任意字符
  • \b:匹配一个边界符 w1 w2
  • \w:数字、字母、下划线中的任意字符 [0-9a-zA-Z_]
  • \s:匹配一个空白字符 空格、一个制表符、换页符...

量词元字符(数量元字符)

  • * :出现零到多次
  • +:出现一到多次
  • ?:出现零次或者一次
  • {n}:出现 n 次
  • {n,}:出现 n 到多次
  • {n,m}:出现 n 到 m 次

标志字符

  • g:全局搜索,记忆方式 global
  • i:不区分大小写,记忆方式 ignore
  • m:多行搜索

使用方式

正则对象的方法
1.test() 方法用于检测一个字符串是否匹配某个模式,若匹配,返回true,否则返回false
eg:手机号验证

    <script>
        var reg = /^1\d{10}$/;//手机号第一位为1,总共有11位
        console.log(reg.test("13765662335"));// true
    </script>

2.exec()方法用于检索字符串中的正则表达式的匹配,若匹配,返回匹配值,否则返回false

匹配时,返回值跟 match 方法没有 g 标识时是一样的。数组第 0 个表示与正则相匹配的文本,后面 n 个是对应的 n 个捕获的文本,最后两个是对象 index 和 input同时它会在正则实例的 lastIndex 属性指定的字符处开始检索字符串 string。当 exec() 找到了与表达式相匹配的文本时,在匹配后,它将把正则实例的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。有没有 g 标识对单词执行 exec 方法是没有影响的,只是有 g 标识的时候可以反复调用 exec() 方法来遍历字符串中的所有匹配文本。当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0
        var string = "2018.07.23";
        var regex2 = /\b(\d+)\b/g;
        console.log( regex2.exec(string) );
        console.log( regex2.lastIndex);
        console.log( regex2.exec(string) );
        console.log( regex2.lastIndex);
        console.log( regex2.exec(string) );
        console.log( regex2.lastIndex);
        console.log( regex2.exec(string) );
        console.log( regex2.lastIndex);


其中正则实例lastIndex属性,表示下一次匹配开始的位置.比如第一次匹配了“2017”,开始下标是0,共4个字符,因此这次匹配结束的位置是3,下一次开始匹配的位置是4。

从上述代码看出,在使用exec时,经常需要配合使用while循环:
        var string = "2018.07.23";
        var regex2 = /\b(\d+)\b/g;
        var result;
        while ( result = regex2.exec(string) ) {
            console.log( result, regex2.lastIndex );
        }

图片描述

正则的匹配

字符匹配

精确匹配就不说了,比如/hello/,也只能匹配字符串中的"hello"这个子串。
正则表达式之所以强大,是因为其能实现模糊匹配。

匹配多种数量

        var str = "cde cdde cddde cdddde cddddde";
        var reg = /cd{3,5}e/g;
        console.log(str.match(reg));

图片描述

贪婪性和懒惰性

贪婪:eg:

        var str = "123";
        var reg = /\d+/g;
        console.log(reg.exec(str));

图片描述

懒惰("//"正则表达式末尾加上"?")eg:

        var str = "123";
        var reg = /\d+?/g;
        console.log(reg.exec(str));

图片描述

匹配多种情况

用字符组[]来匹配多种情况,其他几种形式(dDsSwW)都可以等价成这种。eg:
    <script>
        // 年龄介于18-65之间
        var reg = /^(1[8-9]|[2345]\d|6[0-5])$/;
        console.log(reg.test("19"));//  true
        console.log(reg.test("16"));//  false
    </script>

替换

eg:

    <script>
        var str = "20180723";
        var ary = ["零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"];
        str = str.replace(/\d/g, function() {
            var num = parseInt(arguments[0]);
            var str = ary[num];
            return str;
        })
        console.log(str);
    </script>

图片描述

读正则

不仅自己会写正则,还要读懂其他人写得正则

操作符的优先级是从上到下,由高到低的,所以在分析正则的时候可以根据优先级来拆分正则,比如 /ab?(c|de*)+|fg/
  • 因为括号是一个整体,所以/ab?()+|fg/,括号里面具体是什么可以放到后面再分析
  • 根据量词和管道符的优先级,所以a, b?, ()+和管道符后面的f, g
  • 同理分析括号里面的c|de => c和d, e

综上,这个正则描述的是
图片描述

总结

上面是我今天学习的内容,在这里分享给大家,有什么不对的可以留言给我,争取做到最好,希望大家有什么好的建议,好的文章也可以分享给我,我们共同努力!希望大家多多分享,下面是我的微信号码,有对前端感兴趣的朋友我们可以交流一下:
图片描述


小菜鸟
280 声望13 粉丝

运动让我更有精力!


« 上一篇
JS数组
下一篇 »
JS面向对象