正则常用的四个方法:test() exec() match() replace()
test()
验证字符串是否和正则相匹配
用法:regexp.test(string)
结果:若匹配返回true,若不匹配返回false
exec()
将字符串中匹配的内容捕获出来,只会捕获一次
用法:regexp.exec(string)
返回值:是一个数组,若无分组则数组里的内容包含三项,分别是匹配的内容、匹配内容的起始索引、原字符串
exec()处理分组
返回值:
第一项是匹配的内容
第二项开始是分组(括号里匹配)的内容,有几个分组就有几项
倒数第二项是匹配内容的起始索引
倒数第一项是原字符串
注意:若不需要捕获分布的内容,则在不需要捕获分组的里面加上原字符 ?:(匹配不捕获)
var str = "2018ceshi2019";
var reg = /\d\w/;
console.log(reg.exec(str));//["20", index: 0, input: "2018ceshi2019"]
var reg = /(\d)(\w)/;
console.log(reg.exec(str));//["20", "2", "0", index: 0, input: "2018ceshi2019"]
var reg = /(?:\d)(?:\w)/;
console.log(reg.exec(str));//["20", index: 0, input: "2018ceshi2019"]
match()
将字符串中匹配的内容捕获出来
若加上量词g则一次性捕获所有匹配的内容放到数组里返回,若不加则与exec()的返回值一样
用法:string.match(regexp)
replace()
将字符串中匹配的内容捕获出来
用法:string.replace(值类型 | regexp, 值类型 | 回调函数)
该方法不改变原有字符串
var str = "11a22b33c44d";
var newStr = str.replace(/\d+/g, function ($0,$1,$2) {
// 第一个形参$0 表示匹配的字符
// 第二个形参$1 表示匹配字符的起始索引
// 第三个形参$2 表示原字符串
return $0*2;
});
console.log(str);//11a22b33c44d
console.log(newStr);//22a44b66c88d
// 若有量词,则分组里面的内容是匹配字符的最后一个字符
var newStr2 = str.replace(/(\d+)/g, function ($0,$1,$2) {
// 第一个形参$0 表示匹配的字符
// 若有分组,则从第二个参数开始就是分组的内容
// 倒数第二个形参 表示匹配字符的起始索引
// 倒数第一个形参 表示原字符串
return $0*2;
})
console.log(str);//11a22b33c44d
console.log(newStr2);//22a44b66c88d
经典例题
//大写数字替换小写数字
var str = "38576";
var a = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"];
str = str.replace(/\d/g, function () {
return a[arguments[0]];
});
console.log(str);//叁捌伍柒陆
//排除法
//获取地址栏中的参数并放入对象中
var str = "http://www.baidu.com?id=557131028857&name=ceshi&age=8";
var reg = /([^?=&]+)=([^?=&]+)/g;
var obj = {};
str.replace(reg, function ($0, $1, $2) {
obj[$1] = $2;
});
console.log(obj);//{id: "557131028857", name: "ceshi", age: "8"}
//去掉html标签
var str="<div id='div1' class='aa'>皇帝被废,太后痛哭流涕,</div><p>皇室威严扫地,群臣无不悲愤。</p>";
var reg = /<[^<>]+>/g;
str = str.replace(reg,"");
console.log(str);//皇帝被废,太后痛哭流涕,皇室威严扫地,群臣无不悲愤。
1.用正则表达式,写出由字母开头,其余由数字、字母、下划线组成的6~30 的字符串?
var aInput = document.getElementsByTagName('input');
var reg = /^[a-zA-Z][\w_]{5,29}/;
aInput[1].onclick = function(){
if(!reg.test(aInput[0].value)){
alert('wrong')
}
else{
alert('right')
}
}
2.写出正确的正则表达式匹配固话号,区号3-4 位,第一位为0,中横线,7-8 位数字,中横线,3-4 位分机号格式的固话号
var aInput = document.getElementsByTagName('input');
var reg = /0[0-9]{2,3}-\d{7,8}/;
aInput[1].onclick = function(){
if(!reg.test(aInput[0].value)){
alert('wrong')
}
else{
alert('right')
}
}
3.统计1 到400 亿之间的自然数中含有多少个1?比如1-21中,有1、10、11、12、13、14、15、16、17、18、19、20、21这些自然数有13 个1
var reg = /1+/;
var num =0;
for(var i=0;i<22;i++){
if(reg.test(i)){
num++
}
}
console.log(num);
4.将字符串”<tr><td>{$id}</td><td>{$name}</td></tr>”中的{$id}替换成10,{$name}替换成Tony
'<tr><td>{$id}</td><td>{$id}_{$name}</td></tr>'.replace(/{\$id}/g,'10').replace(/{\$name}/g,'Tony');
// \ 这是引用符,用来将这里列出的这些元字符当作普通的字符来进行匹配。
// 例如正则表达式\$被用来匹配美元符号,
// 而不是行尾,类似的,正则表达式\.用来匹配点字符,而不是任何字符的通配符。
5.匹配输入的字符: 第一个必须是字母或下划线开头, 后面就是字母和数字或者下划线构成, 长度5 - 20
var reg = /^[a-zA-Z_][a-zA-Z0-9_]{4,19}/,
name1 = 'leipeng',
name2 = '0leipeng',
name3 = '你好leipeng',
name4 = 'hi';
alert(reg.test(name1));
alert(reg.test(name2));
alert(reg.test(name3));
alert(reg.test(name4));
网友评论