动态创建RegExp对象

有些情况下,你无法在编写代码时准确知道需要匹配的模式。假设你想寻找文本片段中的用户名,并使用下划线字符将其包裹起来使其更显眼。由于你只有在程序运行时才知道姓名,因此你无法使用基于斜杠的记法。

但你可以构建一个字符串,并使用RegExp构造器根据该字符串构造正则表达式对象。

这里给出一个示例。

  1. let name = "harry";
  2. let text = "Harry is a suspicious character.";
  3. let regexp = new RegExp("\\b(" + name + ")\\b", "gi");
  4. console.log(text.replace(regexp, "_$1_"));
  5. // → _Harry_ is a suspicious character.

由于我们创建正则表达式时使用的是普通字符串,而非使用斜杠包围的正则表达式,因此如果想创建\b边界,我们不得不使用两个反斜杠。RegExp构造器的第二个参数包含了正则表达式选项。在本例中,"gi"表示全局和不区分大小写。

但由于我们的用户是怪异的青少年,如果用户将名字设定为"dea+hl[]rd",将会发生什么?这将会导致正则表达式变得没有意义,无法匹配用户名。

为了能够处理这种情况,我们可以在任何有特殊含义的字符前添加反斜杠。

  1. let name = "dea+hl[]rd";
  2. let text = "This dea+hl[]rd guy is super annoying.";
  3. let escaped = name.replace(/[^\w\s]/g, "\\$&");
  4. let regexp = new RegExp("\\b(" + escaped + ")\\b", "gi");
  5. console.log(text.replace(regexp, "_><_"));
  6. // → This _dea+hl[]rd_ guy is super annoying.