JavaScript 1.10 RegExp的方法和属性
1.RegExp 对象的方法
RegExp 对象有 3个方法:test()、exec()以及 compile()。
test() 方法 | 检索字符串中的指定值。 | 返回值是 true 或false。 |
exec() 方法 | 检索字符串中的指定值。 | 返回值是被找到的值或null。 |
compile() 方法 | 用于改变 RegExp。 |
|
1)test()
var patt1=new RegExp("e");
document.write(patt1.test("The best things in life are free")); //true
2)exec()
var patt1=new RegExp("a.a");
document.exec(patt1.test("aaa aba aca")); //aaa
document.exec(patt1.test("Aaa aba aca")); //aba
document.exec(patt1.test("Aaa Aba aca")); //aca
document.exec(patt1.test("Aaa Aba Aca")); //null
注1:每一次只返回第一个找到的。且每一次都是从最前头开始找。
如果需要找到所有某个字符的所有存在,向 RegExp对象添加第二个参数 "g"
在使用 "a.a" 参数时,exec() 的工作原理如下:
·找到第一个 "a.a",并存储其位置
·如果再次运行 exec(),则从存储的位置开始检索,并找到下一个 "a.a",并存储其位置
var patt1=new RegExp("a.a","g");
do
{
result=patt1.exec("aaa aba aca");
document.write(result+" ");
}
while (result!=null)
结果:aaa aba aca null
注2:若不加"g",每一次都是从最前头开始找,程序会无限循环。
3)compile()
var patt1=new RegExp("e");
patt1.compile("d");
注1:通过compile()方法是对patt1进行修改。若:patt1=new RegExp("d");同样可以达到效果,但是创建了一个新的RegExp。
注2:正则表达式字面量与构造函数的区别:
在ECMAScript 3中规定:
正则表达式字面量共享一个RegExp实例;构造函数每次创建一个新的RegExp实例。
var reg=null;
for(var i=1;i<5;i++){
reg=/cat/g;
reg.test("cataaaaaaa");
//因为共享一个,第二次不会从头开始。
//结果:true false true(上一次测试到末尾没找到,这次从头开始) false
}
for(var i=1;i<5;i++){
reg=new RegExp("cat","g");
reg.test("cataaaaaaa");
//因为每次都新创建,每次从头开始,结果:true true true true
}
注:
ECMAScript 5
规定,正则表达式字面量与构造函数都要每次创建新
RegExp
实例。
IE9+
,
Firefox4+
和
Chrome
都据此做了修改。
2.支持正则表达式的 String 对象的方法
search() | 检索与正则表达式相匹配的值。 | 返回位置值(从0开始)或-1 |
match() | 找到一个或多个正则表达式的匹配。 | 返回匹配值的数组(一个或多个或null) |
replace() | 替换与正则表达式匹配的子串。 | 返回原对象被替换后的结果 |
split() | 把字符串分割为字符串数组。 | 返回分割后的字符串数组 |
1)search()
var str="Visit W3School!"
document.write(str.search(/W3School/)); //6
document.write(str.search(/w3School/)); //search()对大小写敏感,返回-1
document.write(str.search(/w3School/i)); //6
注:
search()
不执行全局匹配,即使有标志
"g"
。并且总是从字符串的开始进行检索,这意味着它总是返回第一个匹配的位置。
2)match()
var str="Visit W3School! Visit W3School!"
document.write(str.search(/W3School/)); //只找第一个,结果:W3School
document.write(str.search(/w3School/)); //只找第一个,但没找到,结果null
document.write(str.search(/W3School/g)); //找全部,结果:W3SchoolW3School
注:不加
"g"
,只找第一个。加
"g"
,找全部。返回值为找到的匹配结果。
3)replace()
格式:replace(正则表达式,“替换值”);
注1:用后者替换正则表达式,正则表达式"g"时,替换全部;否者替换第一个。
注2:替换值是字符串时,加引号。替换值也可以是函数,是函数时,它返回的字符串将作为替换文本使用。
注3:替换值是特殊字符时:
$1、$2、...、$99 | 与 regexp 中的第1 到第99 个子表达式相匹配的文本。 子表达式就是正则表达式中的(),分别对应1-99个()。 |
$& | 与 regexp 相匹配的子串。 |
$` | 位于匹配子串左侧的文本。 |
$' | 位于匹配子串右侧的文本。 |
$$ | 直接量符号。 |
范例:
var str="Visit Microsoft! Visit Microsoft! Visit Microsoft!";
document.write(str.replace(/Microsoft/, "W3School")); //用W3School替换掉第一个Microsoft
document.write(str.replace(/Microsoft/g, "W3School")); //用W3School替换掉全部Microsoft
document.write(str.replace(/Microsoft/i, "W3School")); //不区分大小写
name = "Doe, John";
/* $1,$2分别代表第一个(\w+)和第二个(\w+),第一个是Doe,第二个是John。这里的,是name里的,是要匹配的字符*/
name.replace(/(\w+)\s*, \s*(\w+)/, "$2 , $1"); //结果:John , Doe
name = '"a", "b"';
/* $1代表([^"]*),≥0个非"字符,这个字符前后都有"。在name里就是a和b */
name.replace(/"([^"]*)"/g, "'$1'"); //结果:'a','b'
name = 'aaa bbb ccc';
/*replace参数为函数时,它返回的字符串将作为替换文本使用*/
uw=name.replace(/\b\w+\b/g, function(word){
return word.substring(0,1).toUpperCase()+word.substring(1);}
);
4)split()
格式:stringObject.split(separator,howmany)
separator | 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。 |
howmany | 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个 参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。 |
范例:
var str="How are you doing today?";
document.write(str.split(" ")); //How,are,you,doing,today?
document.write(str.split("")); //H,o,w, ,a,r,e, ,y,o,u, ,d,o,i,n,g, ,t,o,d,a,y,?
document.write(str.split(" ",3));//How,are,you
"2:3:4:5".split(":"); //将返回["2", "3", "4", "5"]
"|a|b|c".split("|"); //将返回["", "a", "b", "c"],第一个就是,分割为""