0

为什么我在 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>
4

2 回答 2

3

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

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

于 2012-07-03T13:40:20.537 回答
2

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

但关键是你的字符串在被这个转义函数获取之前已经被解析了:\w并且\.序列分别变得公正w.前面的斜杠丢失了

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

实际上,转义函数确实恢复了 之前的斜线.,但w在任何方面都不是特别的。) 因此,进入 RegExp 构造函数的字符串[w]不是[\w].

实际上很容易检查:就console.log(regStr) 更换操作之后。

于 2012-07-03T13:49:04.453 回答