欢迎来到知了堂!
知了堂-电话号码 028-87058185

JavaScript之正则表达式-知了堂

JavaScript之正则表达式

  一、创建正则对象:

  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:返回当前正则表达式对象的模式文本的字符串,该字符串不会包含正则字面量两边的斜杠以及任何的标志字符。

JavaScript之正则表达式

 

  三、正则对象的方法:

  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] 混淆)

例如,/\no/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday."中的 "ly"。

\B 

匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。

例如,/\Bon/ 匹配 "at noon" 中的 "on",/yeB/ 匹配 "possibly yesterday."=中的 "ye"。

(?:x)  非捕获组,只做匹配但不捕获内容,所以会带来微弱的性能优势,不会被编号

    版权声明:本文来源于网络,由知了堂搜集整理,仅供大家学习Java时使用