一、创建正则对象:
JavaScript中的正则表达式与Java类似但又有不同。有两种方法可以创建正则表达式对象:
1、正则表达式字面量:将正则表达式放在//之间。例如:
var my_regex=/(?:\\.|[^\\\"])*/g;
2、使用RegExp构造器:该构造器接收一个字符串并将该字符串编译为一个RegExp对象。需要注意的是字符串中的\需要转义为\\,"需要转义为\"。上述正则表达式字面量又可表示为:
var my_regex=new RegExp('\"(?:\\\\.|[^\\\\\\\"])*\"','g');
其中在1最后有标识g,在2中第2个参数是g。g表示全局的,还可以是其他修饰符,这些修饰符和其对应的含义是:
标识符 | 含义 |
g(global) | 标识该表达式将在输入字符串中查找所有可能的匹配,返回的 结果可以是多个,如果不加g最多只会匹配第一个。 每次调用array.exec()都从lastIndex开始查找新的匹配; string.match() 则是返回所有的匹配。 string.replace()则替换所有匹配到的字符串。 |
i(ignoreCase) | 标识匹配的时候不区分大小写 |
m(multiline) | 若不指定m,则:^ 只匹配字符串的最开头,$ 匹配字符串的最结尾。 若指定m,则:^ 匹配字符串每一行的开头,$ 在字符串每一行的结尾。 |
二、正则对象的属性:
1、静态属性:不需要创建正则对象,直接用RegExp即可访问的属性:
①RegExp.input:返回当前要匹配的字符串,也可用RegExp.$_代替;
②RegExp.lastMatch:最后一次匹配到的子串结果,需要开启修饰符g,也可用RegExp['$&']代替;
③RegExp.lastParen:最后一次分组中捕获到的内容,需要开启修饰符g,也可用RegExp['$+']代替;
④RegExp.leftContext:以当前匹配到的子串为上下文,返回之前的子串,也可用RegExp['$&`']代替;
⑤RegExp.rightContext:以当前匹配到的子串为上下文,返回之后的子串,也可用RegExp['$\'']代替;
⑥RegExp.$n:返回1~9个分组的值。
2、实例属性:正则对象可访问的属性:
①reg.global:表示是否开启全局匹配,是一个只读属性;
②reg.ignoreCase:表示是否开启忽略大小写,是一个只读属性;
③reg.multiline:表示是否开启多行模式,是一个只读属性;
④reg.lastIndex:表示exec下一次匹配的起始索引,只有在全局模式g下才会生效;
⑤reg.source:返回当前正则表达式对象的模式文本的字符串,该字符串不会包含正则字面量两边的斜杠以及任何的标志字符。
三、正则对象的方法:
1、test():用于检测正则在指定的字符串中从lastIndex为0处开始是否具有符合的匹配结果,如果匹配到则返回true,否则返回false。
var regex = /^\d+$/;
//或者
var regex = new RegExp('^\\d+$');
var str = '12345';
var ret = regex.test(str); //true
var ret = regex.test(str); //false
var ret = regex.test(str); //true
regex.lastIndex = 0;
var ret = regex.test(str); //true
可以看到如果重复调用test()会出现第一次为true,第二次为false的情况,是因为第一次调用test()之后,lastIndex变为匹配的内容之后的位置(即字符串的末尾),所以第二次就成了false。如果继续调用test(),就会又从lastIndex为0开始。为避免这种情况,可以将lastIndex设置为0再检测。
2、exec():用于从指定的字符串中返回匹配正则的字符串、各分组匹配的字符串、匹配整个正则的字符串在原字符中的索引位置、原输入字符串以及有名字的分组匹配到的字符串。如果正则表达式没有匹配到结果,那么返回的值就是null。
var str = '2012 google';
var regex = /(?<first>\d{4})\s(\w+)/;
var result = regex.exec(str);
console.log(result); //["2012 google", "2012", "google", index: 0, input: "2012 google", groups: {first: "2012"}]
console.log(result[0]);//"2012 google"
console.log(result[1]);//"2012"
console.log(result[2]);//"google"
console.log(result.index);//0
console.log(result.input);//"2012 google"
console.log(result.groups);//{first: "2012"}
如果加/g使用全局匹配,每调用一次exec()匹配一次,lastIndex后移,下次再调用exec()时从lastIndex处开始匹配。
3、toString():返回一个字符串,其值为该正则对象的字面量形式。
四、支持正则的string的方法:
1、str.replace(pattern,given)
根据匹配规则pattern来用指定的内容given去替换str或其部分字符。其中pattern可以是str中的部分字符串也可以是一个正则表达式,given可以是一个字符串,也可以是一个回调函数,该回调函数的入参与正则对象的exec()方法返回的对象中参数相同,该回调函数的返回则是要替换成的内容,例如:
var str = '2016/10/29';
var pattern = /(\d+)(\/)/g;
var data = str.replace(pattern,function(result,$1,$2){
return $1+'.';
});//"2016.10.29"
replace方法只会返回原字符被操作后的副本,并不会对原字符串进行改动。
2、str.match(pattern)
与正则对象的exec(str)方法相似,返回的内容也相似。用指定的正则匹配字符串后返回匹配正则的字符串、各分组匹配的字符串、匹配整个正则的字符串在原字符中的索引位置、原输入字符串以及有名字的分组匹配到的字符串。如果正则表达式没有匹配到结果,那么返回的值就是null。例如:
var str = '2012 google';
var regex = /(?<first>\d{4})\s(\w+)/;
var result = str.match(regex);
console.log(result); //["2012 google", "2012", "google", index: 0, input: "2012 google", groups: {first: "2012"}]
console.log(result[0]);//"2012 google"
console.log(result[1]);//"2012"
console.log(result[2]);//"google"
console.log(result.index);//0
console.log(result.input);//"2012 google"
console.log(result.groups);//{first: "2012"}
3、str.split(pattern,length)
根据正则pattern将字符串拆分为数组,拆分后的数组并不包含作为拆分依据的那个参数。默认情况下是按空字符进行拆分,也就是每个任意的字符作为一个数组元素。pattern参数,可以是正则表达式,也可以是单纯的字符或字符串。length参数,用于设置拆分数组后数组最大的长度(即数组元素的个数),如果不设置length,表示将字符全部拆分为数组。
var str = 'hello world!';
str.split(''); //''空字符(并非空格字符)["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]
str.split('',5) //["h", "e", "l", "l", "o"]
str.split(/\o/g) //["hell", " w", "rld!"]
4、str.search(pattern)
根据正则pattern在字符串中检索指定的结果,如果检索到则返回该结果首字母在原字符中的索引,否则返回-1。其功能类似于indexOf(),只是indexOf()并不支持正则匹配。
var str = 'hello world!';
str.search('o') //4
str.search('x') //-1
五、一些特殊字符的含义:
字符 | 含义 |
[\b] | 匹配一个退格符(backspace) |
\0 | 匹配一个null字符,不要在此后面跟小数点。 |
\cX | X是A-Z的一个字母。匹配字符串中的一个控制字符。例如/^cM/匹配字符串中的control-M。 |
\b | 字边界标识匹配一个零宽单词边界(zero-width word boundary),如一个字母与一个空格之间。 (不要和 [\b] 混淆) 例如,/\bno/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday."中的 "ly"。 |
\B | 匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。 例如,/\Bon/ 匹配 "at noon" 中的 "on",/ye\B/ 匹配 "possibly yesterday."=中的 "ye"。 |
(?:x) | 非捕获组,只做匹配但不捕获内容,所以会带来微弱的性能优势,不会被编号 |
其他正则相关资料参考:https://blog.youkuaiyun.com/lzghxjt/article/details/72587348《JAVA之正则表达式》中正则的规则约定。
参考:Douglas Crockford《JavaScript语言精粹》