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

Different in Convert Regular Expression String to RegExp in Javascript

本文关键字:正则表达式 转换 字符串 javascript      更新时间:2023-09-26

为什么我在对象正则表达式中围绕测试函数的代码与正则表达式模式的工作方式不同。我是否遗漏了某些内容,或者我是否使用了错误的转义正则表达式

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

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

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

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

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

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

实际上,逃逸器功能确实在.之前恢复了斜杠,但w对它来说并不特别。因此,进入 RegExp 构造函数的字符串具有 [w] 而不是 ['w]

实际上很容易检查:只需在更换操作console.log(regStr)即可。