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

在Javascript中将正则表达式字符串转换为RegExp时不同,javascript,regex,ecmascript-5,Javascript,Regex,Ecmascript 5,为什么我在对象RegExp中测试函数的代码与regex模式的工作方式不同。我是遗漏了什么还是使用了错误的escape正则表达式 <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-

为什么我在对象RegExp中测试函数的代码与regex模式的工作方式不同。我是遗漏了什么还是使用了错误的escape正则表达式

<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>

var str=”info@test.com";
//这不管用
var regStr=“^([\w-]+(?:\[\w-]+)*)@((?:[\w-]+\)*\w[\w-]{0,66})\.([a-z]{2,6}:(\.[a-z]{2})$”//此字符串可以是从XSLT获取的任何正则表达式
//转义函数获取自: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=新的RegExp(regStr,“i”);
控制台日志(重新测试(str))//假的
var filter=/^([\w-]+(?:\[\w-]+)*)@((?:[\w-]+\)*\w[\w-]{0,66})\.([a-z]{2,6}:(\.[a-z]{2})$/i
console.log(filter.test(str))//真的

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


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

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


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

请参见,这里有一个混淆。您使用的函数是一种将字符串预处理为正则表达式的好方法,因此您不必担心转义正则表达式元字符,即控制正则表达式行为的符号,而不仅仅是字面意义上的符号

但关键是,字符串在被这个转义函数接受之前已经被解析:
\w
\。
序列分别变成了
w
,前面的斜杠是

对于表2.1中未列出的字符,前面的反斜杠为 已忽略,但不推荐使用此用法,应避免使用

实际上,escaper函数确实恢复了
之前的斜杠,但是
w
在任何情况下都不是特别的。)因此,进入RegExp构造函数的字符串是
[w]
,而不是
[\w]


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

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

但关键是,字符串在被这个转义函数接受之前已经被解析:
\w
\。
序列分别变成了
w
,前面的斜杠是

对于表2.1中未列出的字符,前面的反斜杠为 已忽略,但不推荐使用此用法,应避免使用

实际上,escaper函数确实恢复了
之前的斜杠,但是
w
在任何情况下都不是特别的。)因此,进入RegExp构造函数的字符串是
[w]
,而不是
[\w]


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

所以我的示例正则表达式字符串应该是:
“^([\\w-]+(?:\.\.[\\w-]+)*”(?:[\\w-]+\.)*\\w[\\w-]{0,66}\.([a-z]{2,6}.[[a-z]{2}”)$”/code>是用于此替换的新正则表达式
regStr=regStr.replace(“/\\\/g”,“\\\\\”)
似乎不起作用。我想,只要对原始字符串中的反斜杠进行转义就足够了,而且根本不用转义函数(或者使用同一答案的较长版本)。谢谢。我将让用户在那里使用双反斜杠反斜杠,因此我的示例正则表达式字符串应该是:
“^([\\w-]+(?:\.[\\w-]+])@((?:[\\w-]+\.)*\\w[\\w-]{0,66})\.([a-z]{2,6}(?:\\.[a-z]{2})$”
是用于此替换的新正则表达式
regStr=regStr.replace(“/\\\/g”,“\\\\\”)
似乎不起作用。我想,只要对原始字符串中的反斜杠进行转义就足够了,而且根本不用转义函数(或者使用同一答案的较长版本)。谢谢。我将让用户在反斜杠处重复反斜杠