为什么"("导致正则表达式不匹配?

时间:2014-10-25 13:05:58

标签: javascript regex

我有以下字符串:

var foo = "{(y-7)}({x + d})"
var find = "{(y-7)}";
var replacement = "12";
var re = new RegExp(find, 'g');
foo = foo.replace(re, replacement);

但这导致完全相同的字符串,没有任何变化。 但是,如果我删除了parens,即"("和")"从表达,然后它似乎工作。为什么

当表达式包含"("?

时,为什么它会匹配?

2 个答案:

答案 0 :(得分:4)

你必须逃离(),因为他们有special meaning in regex

var find = "\\{\\(y-7\\)\\}"

同样代表{ and }

这种转义只需要在正则表达式中发生(即你的find),foo就好了,因为那只是一个普通的字符串。

我建议你使用JavaScript的内置功能来减少转义:

var re = /\{\(y-7\)\}/g;

更新

  

字符串就像那样交给我,所以我需要做一个替换

var find = "{(y-7)}";
find = find.replace("\\", "\\\\")
           .replace("(", "\\(").replace(")", "\\)")
           .replace("{", "\\{").replace("}", "\\}");

我称之为“逃避地狱”,但生成正则表达式并非易事,尽管你可能会幸运。 我建议你先学会使用它,然后尝试生成它。

答案 1 :(得分:4)

需要对正则表达式中具有特殊含义的字符进行转义。你通过在它们前面放一个反斜杠来逃避它们,并在你需要通过在它前面放一个反斜杠来逃避它的字符串中放一个反斜杠:

var find = "\\{\\(y-7\\)\\}";

(在某些情况下,字符不需要在正则表达式中转义,因为没有它可以理解它,但首先要逃避所有具有特殊含义的字符,然后你可以阅读确切的情况它不是必需的。)

演示:



var foo = "{(y-7)}({x + d})"
var find = "\\{\\(y-7\\)\\}";
var replacement = "12";
var re = new RegExp(find, 'g');
foo = foo.replace(re, replacement);

// show result in StackOverflow snippet
document.write(foo);