JavaScript引用类型RegExp基本用法详解

1、正则表达式定义

三个标志:全局模式g,不区分大小写模式i,多行模式m。

1) 字面量定义

var pattern = /[fe]at/gim;

2) 构造函数定义:

接收两个参数——要匹配的字符串模式和可选的模式字符串(g,i,m)。

var pattern = new RegExp("[fe]at","gim");

注意:

1) 若需要匹配的字符串中包含以下元字符,就必须对它们进行转义:( [ { \ ^ & | ) ? * + . ] }

2) 由于构造函数定义正则表达式的参数是字符串,所以在某些情况下要对字符时行双重转义如\n,字符\在字符串中通常被转义为\\,而在正则表达式字符串参数中就会变成\\\\,字面量模式/\w\\hello\\123/等价的字符串为“\\w\\\\hello\\\\123”。

2、RegExp实例属性

1) global 表示是否设置了g标志。

2) ignoreCase 表示是否设置了i标志。

3) multiline 表示是否设置了m标志。

4) lastIndex 用于记录上一次匹配结束的位置,即下一次开始搜索下一个匹配项的位置,从0算起。

5) Source返回正则表达式的字符串表示,按照字面量模式返回而非传入构造函数的字符串模式返回。

var pattern = new RegExp("\\[fe\\]at","i"); alert(pattern.source);

以上代码返回\[fe\]at

3、RegExp实例方法

1) 继承的toLocaleString()、toString()、valueOf()方法

toLocaleString():返回正则表达式的字面量,与创建正则表达式的方式无关。

toString():返回正则表达式的字面量,与创建正则表达式的方式无关。

valueOf():返回正则表达式本身。

var pattern1 = /\[fe\]at/i); var pattern2 = new RegExp("\\[fe\\]at","i"); alert(pattern1.toString()); // /\[fe\]at/i alert(pattern1.toLocaleString()); // /\[fe\]at/i alert(pattern2.toString()); // /\[fe\]at/i alert(pattern2.toLocaleString()); // /\[fe\]at/i

2) match()方法

参数:用于匹配的正则表达式。

返回值:区分match()的返回值主要是看是否设置g标志,没有设置g标志时与exec()是等价的。

a. 如果设置g标志,那么返回的是包含所有匹配项的数组。

b. 如果没有设置g标志,那么返回的是包含第一个匹配项的数组,第0项是与整个正则表达式匹配的字符串,第1项是是与第1个子表达式相匹配的文本(如果有的话),第2项是与第2个子表达式相匹配的文本(如果有的话)。

3) exec()方法

参数:要应用模式的字符串。

返回值:返回包含第一个匹配项信息的数组,没有匹配项的情况下返回null。exec()的返回值不受g标志影响,在不设置g标志时,在同一个字符串上多次调用exec()将会始终返回第一个匹配项的信息。即使设置了g标志,一次也只返回一个匹配项,但设置g标志时,每次调用exec()都会在字符串中继续查找新匹配项,会驱动lastIndex可以模拟遍历所有匹配,可以与match()设置g标志时等价(区别在于遍历所有匹配时,exec()需要多次匹配,match()一次匹配即可得到所有匹配)。

返回的数组包含额外的两个属性:index和input。其中,index表示匹配项在字符串中的位置,而input表示应用正则表达式的字符串。在数组中,第0项是与整个正则表达式匹配的字符串,第1项是是与第1个子表达式相匹配的文本(如果有的话),第2项是与第2个子表达式相匹配的文本(如果有的话)。

var str = "Shanghai and Beijing and Guangzhou"; var pattern = /Shanghai ( and Beijing ( and Guangzhou)?)?/gi; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//"Shanghai and Beijing and Guangzhou" alert(match[0]);//"Shanghai and Beijing and Guangzhou" alert(match[1]);//"and Beijing and Guangzhou" alert(match[2]);//"and Guangzhou"

在不设置g标志的情况下,同一个字符串上调用exec()始终返回第一个匹配项的信息。

var str = "fat eat"; var pattern = /.at/; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//0 var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//0

设置全局标志g情况下,同一个字符串上调用exec()每次会返回一个新的匹配项的信息。

var str = "fat eat"; var pattern = /.at/g; var match = pattern.exec(str); alert(match.index);//0 alert(match.input);//fat eat alert(match[0]);//fat alert(pattern.lastIndex);//3 var match = pattern.exec(str); alert(match.index);//4 alert(match.input);//fat eat alert(match[0]);//eat alert(pattern.lastIndex);//7

4)  test()方法

参数:要应用模式的字符串

返回值:在模式与该参数匹配的情况下返回true,否则返回false。

test()方法经常用于if语句中。

问题:

如果正则表达式带有标志g,使用test校验不同的字符串时,RegExp会使用test前一个字符串得出的lastIndex去test后一个字符串,必定出错。

var pattern = /^[1-9]\d{4,10}$/gi; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; alert(pattern.test(str));//返回false

解决方法:

① 将正则表达式的 lastIndex 属性设置为0 再用作校验

var pattern = /^[1-9]\d{4,10}$/gi; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; pattern.lastIndex=0; alert(pattern.test(str));//返回true

② 正则表达式去掉标志g

var pattern = /^[1-9]\d{4,10}$/i; var str = "88888"; alert(pattern.test(str));//返回true str = "888888"; alert(pattern.test(str));//返回true

5) 说明:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/8a87650d790c6fc07cfa20ec4fe138b2.html