告诉正则表达式不要做它应该做的事情。 (不要替换$&)

时间:2016-03-14 15:51:22

标签: javascript regex selenium nightwatch.js

所以我有一个用于测试的预处理器来替换注释以便以干燥的方式构建自动化测试。它会生成可以正常运行的文件。当我需要在测试步骤中使用正则表达式时,唯一的问题就出现了,如下所示:

.step(/^Search for special characters$/, function() {
    client.setValue("input[type=text]", "@#$%^&*()_ -={}[]|\\\"':;? >.<,`©®ÉÖ]]™\"".replace(/[-[\]{}()*+?.,\\^$|"'#\s]/g, "\\$&")
}

当然,我最终得到的是一个看起来像这样的测试文件:

client.setValue("input[type=text]", "@#$%^&*()_ -={}[]|\\\"':;? >.<,`©®ÉÖ]]™\"".replace(/[-[\]{}()*+?.,\\^$|"'#\s]/g, "\\//Search for special characters")

有没有告诉javascript“不要用匹配结果替换$&amp;”?

2 个答案:

答案 0 :(得分:3)

.replace()函数替换(interploates)以$开头的内容。所以$是你需要转义的字符,因为反斜杠仍然是JS字符串本身的转义机制。

这可以加倍:

"foo".replace(/foo/, "$$&")

另见:The spec, section 15.5.4.11

答案 1 :(得分:2)

除非我误解整个工作流程,否则$$似乎有效:

txt = '123';

step = function(re, fn) {
  return txt.replace(re, fn.toString());
}

code = step(/^123$/, function() {
    return "abc".replace(/./g, "$$&")
});
  
document.write(code);
document.write("<br>");
document.write(eval("(" + code + ")()"));