为什么围绕Object RegExp中的测试函数的代码与正则表达式模式的工作方式不同。我错过了什么,或者我使用了错误的逃避正则表达式
<html>
<body>
<script type="text/javascript">
var str = "info@test.com";
//This isn't working
var regStr = "^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$"; //This string can be any regex get from XSLT
//Escape function get from: http://stackoverflow.com/a/6969486/193850
regStr = regStr.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
console.log(regStr); // \^\(\[w\-\]\+\(\?:\.\[w\-\]\+\)\*\)@\(\(\?:\[w\-\]\+\.\)\*w\[w\-\]\{0,66\}\)\.\(\[a\-z\]\{2,6\}\(\?:\.\[a\-z\]\{2\}\)\?\)\$
var re = new RegExp(regStr , "i");
console.log(re.test(str)); //false
var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
console.log(filter.test(str)); //true
</script>
</body>
</html>
答案 0 :(得分:3)
将正则表达式作为字符串写入时,必须加倍反斜杠。
为什么呢?字符串文字语法也遵守其自己的反斜杠引用约定,例如引号字符,换行符等。因此,当JavaScript解析包含正则表达式的字符串常量时,反斜杠将消失。因此,您需要使用另一个反斜杠引用它们,这样当您将字符串传递给RegExp构造函数时,它会看到您实际想要的正则表达式。
答案 1 :(得分:2)
看,有一个混乱。您使用的函数是预处理字符串准备的一种很好的方法,因此您不必担心转义正则表达式元字符 - 即,将控制正则表达式行为的符号,以及不只是字面意思。
但关键是你的字符串在被这个转义函数占用之前已经被解析了:\w
和\.
序列分别只变成了w
和.
,前面的斜线是lost。
对于表2.1中未列出的字符,前面的反斜杠是 忽略了,但这种用法已被弃用,应该避免使用。
实际上,escaper函数确实在.
之前恢复了斜杠,但w
在任何类型中都不是特殊的。因此,进入RegExp构造函数的字符串有[w]
而不是[\w]
。
实际上很容易检查:在替换操作后只需console.log(regStr)
。