一般字符串方法都可以实现正则的捕获

字符串中常用的支持正则的方法: 
match 
split 
replace 
…


split

var str = 'name=珠峰&age=8&lx=teacher';
str.split(/&|=/); //=>["name", "珠峰", "age", "8", "lx", "teacher"]

str.split(/(&|=)/); //=>["name", "=", "珠峰", "&", "age", "=", "8", "&", "lx", "=", "teacher"]

//=>在使用split进行字符串拆分的时候,如果正则中包含小分组,会把小分组中的内容都捕获到,放在最后的数组中

//=>本案例中的小括号仅仅是为了实现 改变默认的优先级 问题,但是我们不想把分组中的内容捕获到 
=> “只想匹配不想捕获”  我们可以使用 (?:)
str.split(/(?:&|=)/); //=>["name", "珠峰", "age", "8", "lx", "teacher"]

//=>只匹配不捕获:
//在当前一个分组中加了 ?: ,在正则检测匹配的时候,小分组可以起到自己应有的作用(例如:改变优先级...),
但是在捕获的时候,遇到带?:的小分组,浏览器不会把当前这个分组中匹配的内容,单独去捕获了

var reg = /^(d{6})(d{4})(d{2})(d{2})(d{2})(d)(d|X)$/;
reg.exec('130828199012040617'); //=>["130828199012040617", "130828", "1990", "12", "04", "06", "1", "7"...]

var reg = /^(d{6})(d{4})(d{2})(d{2})(?:d{2})(d)(?:d|X)$/;
reg.exec('130828199012040617');//=> ["130828199012040617", "130828", "1990", "12", "04", "1"...]

var reg = /^-?(d|([1-9]d+))(.d+)?$/;//=>计算是第几个分组的时候,我们从左向右找 ( 即可


replace

replace:字符串中原有字符的替换 

str.replace(old,new)

var str = '珠峰2017珠峰2018';
str = str.replace('珠峰','珠峰培训');
str = str.replace('珠峰','珠峰培训');
//=>'珠峰培训培训2017珠峰2018' 没有实现我们希望的效果

//=>在不使用正则的情况下,执行一次replace只能替换一个原有字符,第二次执行replace,还是从字符串的开始位置查找,
把最新找到的字符替换为新字符(类似于正则捕获时候的懒惰性:每一次执行都是从字符串最开始的位置查找)

真实项目中,replace一般都是和正则搭配在一起使用的

var str = '珠峰2017珠峰2018';
str = str.replace(/珠峰/g,'珠峰培训');
//=>"珠峰培训2017珠峰培训2018"

replace原理: 

1、当replace方法执行,第一项传递一个正则 

正则不加g:把当前字符串中第一个和正则匹配的结果捕获到,替换成新的字符 

正则加g:把当前字符串中所有和正则匹配的内容都分别的捕获到,而且每一次捕获,都会把当前捕获的内容替换为新字符


2、当replace方法执行,第二个参数传递的是一个函数(回调函数) 

首先用正则到字符串中进行查找匹配,匹配到一个符合规则的,就把传递的函数执行一次 

不仅执行这个函数,而且还把正则本次捕获的结果(和执行exec捕获的结果一样:数组、大正则匹配、小分组匹配 都有)当做实参传递给这个函数(这样就可以在函数中获取这些值:而这些值就是正则每一次捕获的结果 )

var str = 'my name is {0},i am {1} years old,i can {2}!';
var reg = /{(d+)}/g;
str.replace(reg, function () {
    //=>传递的函数一共被执行三次
    //=>console.log(arguments) 每一次匹配捕获到结果,不仅把这个方法执行了,
    而且还会把当前捕获的结果当做实参传递给这个函数(ARG)
    /*
     * 第一次执行函数,获取的是ARG类数组
     *  0:'{0}' 本次大正则匹配的结果
     *  1:'0'   本次第一个小分组匹配的结果
     *  2:11    本次大正则匹配结果在字符串中的索引 index
     *  3:'my nam...' 原始字符串 input
     *
     * 和每一次执行exec实现捕获的结果非常类似
     */

    //return xxx;//=>每一次执行函数,函数中RETURN的结果,都相当于把本次大正则匹配的内容替换掉(原始字符串不变)
});