正则表达式用的不是特别多,好多知识就总是忘,所以就总结一下。
创建一个正则有两种:
var reg=new RegExp("^a", "ig");
var reg=/^a/ig;
//全局查找不区分大小写的以字母a开头的字符串
正则表达式以/
为限定符,修饰符有i
(不区分大小写),g
(全局匹配),m
(多行匹配)。
(1)lastIndex:上一次匹配文本之后的第一个字符的位置,不具有标志 g 和不表示全局模式的 RegExp
对象不能使用 lastIndex
属性。
//lastIndex是循环出现的
var reg=/123/g;
var str="123123";
reg.exec(str); //["123", index: 0, input: "123123123", groups: undefined]
reg.exec(str); //["123", index: 3, input: "123123123", groups: undefined]
reg.exec(str); //null
reg.exec(str); //["123", index: 0, input: "123123123", groups: undefined]
//如果在成功地匹配了某个字符串之后就开始检索另一个新的字符串,需要手动地把这个属性设置为 0。
var reg=/123/g;
var str1="123456789";
var str2="123456abc";
if(reg.test(str1)){
console.log(reg.lastIndex); //3
if(reg.test(str2)){ //false,if判断内不执行
console.log(reg.lastIndex);
console.log("都含有123");
}
}
if(reg.test(str1)){
console.log(reg.lastIndex); //3
reg.lastIndex=0;
if(reg.test(str2)){ //true,if判断内执行
console.log(reg.lastIndex); //3
console.log("都含有123"); //输出:都含有123
}
}
(2)global:是否具有标志 g,即是否是全局搜索。
(3)ignoreCase:是否具有标志 i,即是否不区分大小写。
(4)multiline:是否具有标志 m,即是否是多行匹配。
(5)source:以字符串的形式返回正则表达式的源文本。
正则表达式为空的时候返回字符串"(?:)"
。
var reg=/123/ig;
console.log(reg.source==="123"); //true
reg=new RegExp("abc","g");
console.log(reg.source==="abc"); //true
//需要注意的是:"\"是转义字符
var patt=/\w\d/g;
console.log(patt.source); //"\w\d"
console.log(patt.source=="\w\d"); //false
console.log(patt.source==="\\w\\d"); //true
patt=new RegExp("\w\d","g");
console.log(patt.source); //"wd"
console.log(patt.source==="wd"); //true
console.log(patt.source==="\w\d"); //true
console.log("\w\d"==="wd"); //true
var reg=/[a-z]{2}/;
var str="123abc";
true
或 false
。console.log(reg.test(str)); //匹配返回true,不匹配返回false
// 结果为true
null
。var arr=reg.exec(str); //返回匹配到的信息
console.log(arr); //["ab", index: 3, input: "123abc", groups: undefined]
console.log(arr[0]); //"ab",匹配到的子串
console.log(arr[index]); //3,匹配到的子串索引值
console.log(arr[input]); //"123abc",被检测的全串
reg=/[a-z]{1}/;
reg.compile(reg);
console.log(reg.exec(str)[0]); //"a"
search()
不支持全局搜索,不会改变lastIndex
的值,只返回第一个匹配子串的索引,如果没有找到匹配的返回-1
。str.search(reg); //3
null
(和reg.exec(str)
返回值一样);如果是 全局 匹配,返回匹配到的子串所组成的数组。str.match(reg); //["ab", index: 3, input: "123abc", groups: undefined],不是全局匹配
reg=/[a-z]{2}/g; //全局匹配下
str="123abcd";
str.match(reg); //["ab", "cd"]
var word="a1b2c3d4e5f6g7";
var newWord="";
console.log(word.replace(/[a-z]/g," num:")); // " num:1 num:2 num:3 num:4 num:5 num:6 num:7"
newWord = word.replace(/[a-z]/g,function(word){
console.log(word); //a //b //c //d //e //f //g
return " num:"
})
console.log(newWord);// " num:1 num:2 num:3 num:4 num:5 num:6 num:7"
replacement还可以是$1…$9(正则中子表达式匹配到的串)。
符号 | 匹配到的文本 |
---|---|
$1…$9 | 第 1 到第 99 个子表达式(分组)相匹配的文本 |
$& | 与表达式相匹配的子串 |
$` | 位于匹配子串左侧的文本 |
$’ | 位于匹配子串右侧的文本 |
$$ | 直接量符号(没有测试出来) |
示例:
var name = '"a", "b"';
name.replace(/"([^"]*)"/g, "'$1'"); //"'a', 'b'"
//等同于
name.replace(/"([^"]*)"/g, function(word,$1){
return "'"+$1+"'"
}); //"'a', 'b'"
var text="123a3f567y89";
console.log(text.split(/[a-z]/)); //["123", "3", "567", "89"]
exec(str)
,test(str)
支持全局搜索,会改变lastIndex
的值。字符串的则不支持。$1...$9
是RegExp
的静态属性,是表达式中分组所匹配到的文本,如果超过9个,就是最后9个,例:var str="123,45,6789";
var reg=/(\d{3}),(\d{2}),(\d{4})/;
reg.test(str); //true
console.log(RegExp.$1); //"123"
console.log(RegExp.$2); //"45"
console.log(RegExp.$3); //"6789"
知识点总结,不断更新中…
1.javascript正则知识(一):正则的语法(元字符、转义字符…)