通常,写正则表达式我喜欢使用直接量语法,觉得比较方便,但是究竟二者有何区别还真是少有研究。今天浅浅分析一下,以后发现其他区别会继续跟进。
我们使用 str.replace(/s/g,"world") 可以将字符 "s" 替换成 "world" ,但是这个"s"是指定字符串,不能是变量,如果将s变为变量,如 s[i],则无法得到正确的值,alert一下,发现 /s[i]/ 会被当做一个字符串" /s[i]/ "处理。使用拼接组合仍然得不到正确的值。
如果需要替换一个变量怎么办? s = "abc" 怎样将全部 abc 替换成 "world" ?
这个时候就要用到创建对象的语法,代码如下:
str.replace(new RegExp(s,"g"),"world")
s 中不要包含正则元字符 否则会产生错误
除以上情况外,对直接量和创建RegExp对象做了如下对比:方法一为直接量语法,方法二为创建对象语法
html代码
<input type="text" id="regInput"><button onclick="checkReg()">直接量</button><br/><br/>
<input type="text" id="regInput2"><button onclick="checkReg2()">创建 RegExp 对象</button>
js代码:
<script>
function checkReg(){
var reg1 = /^[a-zA-Z][a-zA-Z_0-9]{4,19}$/ //定义局部变量,如果写在函数外面或者不加var则表示是全局变量...这时其实已经创建了regExp对象,后面可以直接调用其test()方法
var t = document.getElementById("regInput").value //注意要写value,不然只是把regInput对象抓出来
var che = reg1.test(t); //test方法返回的是ture/false
if(che) {alert("输入正确!")}
else {alert("错误,重新输入");}
}
function checkReg2(){
var reg2 = new RegExp("^[a-zA-Z][a-zA-Z_0-9]{4,19}$");
var m = document.getElementById("regInput2").value;
function testReg(a){
return reg2.test(a); //定义testReg函数,根据传入字符串返回检测的结果
}
if(testReg(m)){alert("输入正确!")} //将字符串以参数形式传入testReg方法,
else {alert("错误,重新输入");}
}
</script>
根据多次测试和替换,以及alert跟踪,发现二者完全可以互换。
综上所述,在定义/reg/直接量之时,已经创建了regExp对象,并直接带有test函数。二者暂无发现其他特殊区别,可放心使用。