javascript中的正则

一、js中的正则就是用来处理字符串的。

1、验证字符是否符合规则---》匹配

2、获取字符串中符合规则的内容---》捕获

二、js中定义正则创建方式:

1、字面量创建;    //var reg = /d/;

2、实例创建方式;   //var reg = RegExp();

三、两种方式的区别:

1、实例创建遇到d等要多加一个

2、实例创建可以进行字符串拼接。可以把一个变量放到正则中作为规则字符串

四、正则组成:元字符和修饰符

元字符分为:特殊元字符,量词元字符,普通元字符

1、特殊元字符

 d: 代表0-9之间的一个数字   === [0-9]

 w: 数字、字母、下划线中的任意一个字符  ===  [a-zA-Z0-9_]

  : 一个换行

 s: 一个空白字符(空格 制表符)

 : 匹配一个边界(字母和空格之间也是边界)

 ^: 以某一个元字符开始

 $: 以某一个元字符结束

 .: 除了 意外的任意一个字符

 : 转义符

 |: 或者

(): 分组,或者打正则中的一个小正则

[xyz]: x、y、z其中的一个

[^xyz]: 除了xyz之外的任意一个

[] 包起来的字符都是代表本身意思,没有特殊意义。例如,“.+”

2、量词元字符

 *: 出现零到多次

 +:一到多次

 ?:零或者一次

 {n}: 出现n次

 {n,}:n到多次

 {n,m}:n到m次

3、普通元字符

  所有的字符都可以作为普通元字符,普通元字符就代表自己本身意思的字符。

4、修饰符

i:ignoreCase 忽略大小写

g:global  全局匹配

m: multiline  匹配换行

五、RegExp对象方法

1、exec

  捕获。返回一个数组,其中存放匹配结果。如果未找到匹配,则返回值为null。每次只能捕获一个内容,如果需要多次匹配需要添加g修饰符。然后循环捕获匹配的内容。那么有没有可以一次捕获到所有内容的呢。当然,字符串中有一个match可以做到。but它也有一些自己的弊端。后面会介绍字符串的匹配方法。

  例如:返回 ["2015", index: 2, input: "你好2015,我在2016"]

     数组第一项:当前正则捕获到的内容,第二项:index是捕获到内容的索引,第三性:input是捕获的那个原始字符串

  正则的捕获分为两个阶段:

  1)先匹配,匹配成功在进行捕获,匹配不成功返回null

  2)按照进行捕获

2、test

    匹配。匹配字符串中制定的值。返回true或者false。

六、正则的两个特性,既懒惰又贪婪

  1、懒惰,默认执行一次exec只把第一个符合规则的捕获到,第二及以后的都不捕获

    取消捕获的懒惰性用全局修饰符g来处理,例子:

    var reg = /d+/g;  //或者 var reg = new RegExp("\d+","g");
    var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
    var res = reg.exec(str);

    while(res){
        console.log(res);
        res = reg.exec(str);
    }

  2、贪婪,每一次都按照规则最长的进行捕获

   取消正则的贪婪性:

   1)?如果放在普通元字符后面他就是量词元字符,代表出现0-1次

   2)?如果放在量词元字符后面,代表取消正则的贪婪捕获

   例子:

    var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
    var reg = /d+?/g;
    console.log(reg.exec(str));
    console.log(str.match(reg));

 七、正则中的分组

  1、分组捕获

  如果一个正则中存在分组,在捕获的时候,可以把分组中的内容获取到

  如果在使用分组时,只想匹配,不想捕获时,只需要在分组的最前面加 ?: 即可

  例如下面的代码:

    var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
    var reg = /(?:d+)([u4e00-u9fa5]+,?)/g;
    var ary = reg.exec(str);
    console.log(ary);

  //ary[0]  大正则捕获的内容
  //ary[1]  第一个分组(不加?:的第一个分组)捕获的内容
  //ary[2]  第二个分组(不加?:的第二个分组)捕获的内容
  //...
  //ary[n]  第n个分组(不加?:的第n个分组)捕获的内容

   说到分组捕获,上面提到的字符串match方法,虽然可以一次捕获所有内容,但是不能捕获分组中内容。

    var reg = /(d+)/g;
    var str = "我们公司2015年有2500名员工,其中百分之60都是80后。";
    console.log(str.match(reg));

  2、正则中的分组引用

  正则中某一部分需要和另外一部分一模一样,使用分组引用处理。

  例如:

var reg = /^([a-z])([a-z])21$/;
console.log(reg.test("woow"));

//  1 是第一个分组的引用,必须和第一个分组一模一样的内容才可以
//  2 是第二个分组的引用,必须和第二个分组一模一样的内容才可以

八、支持正则表达式的String对象的方法

  1、replace  替换与正则表达式匹配的子串。返回一个新的字符串。

    有两个必填函数:

   1)规定字符串,或者要替换的正则对象

     第一个参数如果是正则,每匹配一次replace方法就执行一次(不要忘记加g)

   2)可以是字符串或生成替换文本的函数

    第二个参数是function,每捕获一次函数就执行一次,不光是执行,执行的时候浏览器还默认传递了参数

    var str = "welcome to jin ji lie liu xue! good good study, day day up!";
    var reg = /(?:^| +)?([a-z]+)(?: +|$)?/g;
    str = str.replace(reg,function(){
        // console.dir(arguments);
        //我们当前能够进行捕获的分组只有一个,传进来的参数有四个。
        //第一个:大正则捕获的内容   arguments[0]     == exec ary[0]
        //第二个:第一个分组捕获的内容 arguments[1]    == exec ary[1]
        //第三个:打正则捕获的开始索引    arguments[2]    == exec index
        //第四个:原始字符串    arguments[3]    ==     exec input

        // var tar = arguments[1];    //每一次匹配,第一个分组捕获的内容
        var tar = RegExp.$1;
        var f = tar.charAt(0).toUpperCase();
        tar = f + tar.substr(1);
        return " " + tar;
    });

    console.log(str);
原文地址:https://www.cnblogs.com/dollarzhang/p/4650887.html