昨天说了几个RegExp的几个实例属性
虽然有那么多属性,但是基本用不到,为什么呢?因为这些信息都包含在模式声明中了: 字面量创建的正则
var reg = /\[abc\]de/i
console.log(reg.global);//=>false
console.log(reg.ignoreCase);//=>true
console.log(reg.multiline);//=>false
console.log(reg.lastIndex);//=>0
console.log(reg.source);//=>\[abc\]de
通过RegExp构造函数创建的也是一样的结果
var reg2 = new RegExp("\\[bc\\]at","i")
console.log(reg2.global);//=>false
console.log(reg2.ignoreCase);//=>true
console.log(reg2.multiline);//=>false
console.log(reg2.lastIndex);//=>0
console.log(reg2.source);//=>\[abc\]de
说到正则表达式,不得不提replace stringObject.replace(regexp/substr,replacement)
返回一个新的字符串,是用 参数2 替换了 参数1 的第一次匹配或所有匹配之后得到的。
replace例一:匹配一次,区分大小写
var aStr = "Hello 陌上寒!"
var bStr = aStr.replace("陌上寒", "正则表达式")
console.log( bStr)//=>Hello 正则表达式!
replace例二:全局匹配
var cStr =`你好 陌上寒! 我是陌上寒,我们一起来交流讨论前端,每天更新,欢迎关注`
var dStr = cStr.replace(/陌上寒/g, "moshanghan")
console.log(dStr)//=>你好 moshanghan!
//=>我是moshanghan,我们一起来交流讨论前端,每天更新,欢迎关注
replace例三:忽略大小写,匹配一次
var cStr ="我是 Moshanghan! moshanghan是我"
var dStr = cStr.replace(/moshanghan/i, "陌上寒")
console.log(dStr)//=>我是 陌上寒! moshanghan是我
replace例四:忽略大小写,全局匹配
var cStr ="我是 Moshanghan! moshanghan是我"
var dStr = cStr.replace(/moshanghan/ig, "陌上寒")
console.log(dStr)//=>我是 陌上寒! 陌上寒是我
加点难度 replace例五:hello, moshanghan转换为moshanghan hello 以下的输出是相同的
var name = "hello, moshanghan";
var a = name.replace(/(\w+)\s*,\s*(\w+)/, "$2 $1");
console.log(a);//=>moshanghan hello
var b = name.replace(/(\w+)\s*, (\w+)\s*/, "$2 $1");
console.log(b);//=>moshanghan hello
var c = name.replace(/(\w+), (\w+)/, "$2 $1");
console.log(c);//=>moshanghan hello
var d = name.replace(/(\w*), (\w*)/, "$2 $1");
console.log(d);//=>moshanghan hello
replace例六:
var name = `"a", "b"," dd"`;
var aa = name.replace(/"([^"]*)"/, "'$1'");
console.log(aa); //=>'a', "b"," dd"
console.log(/"([^"]*)"/g.test(name));
replace例七:
var name = 'aaa bbb ccc';
var uw = name.replace(/\b\w+\b/g, function (word) {
return word.substring(0, 1).toUpperCase() + word.substring(1);
});
console.log(uw); //Aaa Bbb Ccc
要理解上面的,有几个关于正则的概念需要知道
下面的正则表达式可以匹配kidkidkid:
var b =/kidkidkid/
console.log(b.test('kidkidkid')); //=>true
而另一种更优雅的写法是:
var b =/(kid){3}/
console.log(b.test('kidkidkid')); //=>true
这里由圆括号包裹的一个小整体称为分组。
一个分组中,可以有多个候选表达式,用|分隔:
var reg = /I love (him|her|it)/;
console.log(reg.test('I love him'));//=>true
console.log(reg.test('I love her'));//=>true
console.log(reg.test('I love it'));//=>true
console.log(reg.test('I love them'));//=>false
被正则表达式匹配(捕获)到的字符串会被暂存起来。其中,由分组捕获的串会从1开始编号,于是我们可以引用这些串
var reg = /(\d{4})-(\d{2})-(\d{2})/
var date = '2010-04-12'
reg.test(date)
console.log(RegExp.$1);//=>2010
console.log(RegExp.$2);//=>04
console.log(RegExp.$3);//=>12
$1引用了第一个被捕获的串,$2是第二个,依次类推。
如果碰到类似/((我) 就 (是 (陌上寒)))/的嵌套分组,捕获的顺序是什么?来试试:
var reg = /((我) 就 (是 (陌上寒)))/
var str = "我 就 是 陌上寒"
reg.test( str ) // true
console.log(RegExp.$1);//=>我 就 是 陌上寒
console.log(RegExp.$2);//=>我
console.log(RegExp.$3);//=>是 陌上寒
console.log(RegExp.$4);//=>陌上寒
规则是以左括号“(”出现的顺序进行捕获。