字符串中常用的支持正则的方法: 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的结果,都相当于把本次大正则匹配的内容替换掉(原始字符串不变) });