在Javascript中将正则表达式字符串转换为RegExp不同

时间:2012-07-03 13:38:34

标签: javascript regex ecmascript-5

为什么围绕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>

2 个答案:

答案 0 :(得分:3)

将正则表达式作为字符串写入时,必须加倍反斜杠。

为什么呢?字符串文字语法遵守其自己的反斜杠引用约定,例如引号字符,换行符等。因此,当JavaScript解析包含正则表达式的字符串常量时,反斜杠将消失。因此,您需要使用另一个反斜杠引用它们,这样当您将字符串传递给RegExp构造函数时,它会看到您实际想要的正则表达式。

答案 1 :(得分:2)

看,有一个混乱。您使用的函数是预处理字符串准备的一种很好的方法,因此您不必担心转义正则表达式元字符 - 即,将控制正则表达式行为的符号,以及不只是字面意思。

但关键是你的字符串在被这个转义函数占用之前已经被解析了:\w\.序列分别只变成了w.,前面的斜线是lost

  

对于表2.1中未列出的字符,前面的反斜杠是   忽略了,但这种用法已被弃用,应该避免使用。

实际上,escaper函数确实在.之前恢复了斜杠,但w在任何类型中都不是特殊的。因此,进入RegExp构造函数的字符串有[w]而不是[\w]

实际上很容易检查:在替换操作后只需console.log(regStr)