javascript正则知识(二)

正则表达式用的不是特别多,好多知识就总是忘,所以就总结一下。
创建一个正则有两种:

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";
(1)正则的方法
  1. test()方法:是否匹配,返回 truefalse
console.log(reg.test(str)); //匹配返回true,不匹配返回false
// 结果为true
  1. exec()方法:匹配就返回一个结果数组(找到的值及其位置),如果不匹配返回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",被检测的全串
  1. compile()方法:用于在脚本执行过程中编译正则表达式,也可用于改变和重新编译正则表达式。(不做详细解释,还没有找到实用情况)
reg=/[a-z]{1}/;
reg.compile(reg);
console.log(reg.exec(str)[0]); //"a"
(2)字符串的方法
  1. search()方法:查找与正则相匹配的子串,返回子串的索引值。
    search()不支持全局搜索,不会改变lastIndex的值,只返回第一个匹配子串的索引,如果没有找到匹配的返回-1
str.search(reg); //3
  1. match()方法:如果不是 全局 匹配,就返回一个结果数组(找到的值及其位置),如果不匹配返回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"]
  1. replace(regexp/substr,replacement)方法:替换将匹配正则的子串(或者是字符串),返回值是新串。(如果不是全局搜索,只替换第一个)
    replacement可以是字符串、函数。
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'"
  1. split(regexp/substr)方法:以正则匹配的子串(或者是以字符串)为分割点,返回值是分割好的子串组成的数组。
var text="123a3f567y89";
console.log(text.split(/[a-z]/)); //["123", "3", "567", "89"]
 总结补充: 
  1. 正则的方法exec(str)test(str)支持全局搜索,会改变lastIndex的值。字符串的则不支持。
  2. $1...$9RegExp的静态属性,是表达式中分组所匹配到的文本,如果超过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正则知识(一):正则的语法(元字符、转义字符…)

你可能感兴趣的:(技术贴,javascript,正则表达式)