是否可以放弃替换字符串顺序?

Is it possible to forgo replace string order?

我正在开发一个扩展程序,它本质上是 运行 通过文本替换来设置网站 UI。我用this article作为基础,但是我运行陷入了一个小问题:

为了简单起见,假设我想将 运行slate "books" 设为 "presents." 所以使用文章中的模板,我写:

v = v.replace("books", "presents");

但是还有另一个字符串我正在尝试 运行slate:"Choose books" 到 "Select presents." 所以我写了以下内容:

v = v.replace("books", "presents");
v = v.replace("Choose books", "Select presents");

发生的情况是字符串 "Choose books" 被替换为 "Choose presents" 而不是整个字符串被预期的 "Select presents."

替换

我在这里错过了什么?我知道字符串命令会考虑顺序,但是无论如何都要忽略它吗?正则表达式标志可能与它有关吗?

I know string commands take order into account, but is there anyway to ignore this?

没有。每个 replace 调用 ("string command") 都是单独的并创建一个新字符串,然后在该新字符串上调用 next 方法。你不能忽视这一点。

Could regex flags have something to do with it?

没有。标志只能影响单个替换的行为,它们对其他调用一无所知。


那么你能做什么呢?显而易见的选择是调整调用顺序,以便没有模式匹配任何先前的替换:

v = v.replace("Choose books", "Select presents").replace("books", "presents");

另一种方法(可能就是您对 "regex flags" 的意思)是一次进行所有替换。您可以使用 replacement callback 到 select 正确的新表达式:

v = v.replace(/(Choose )?books/g, function(match, capture) {
    if (capture) // or `match == "Choose books" or …
        return "Select presents";
    else
        return "presents";
});

您应该首先替换更具体的字符串(或最长的),例如

  • "Choose books with topic" => "Select presents with category"
  • "Choose books" => "S
  • "Select presents" "Choose" => "Select"

但是您自动替换的字符串越小,该过程替换您不想替换的字符串的错误次数就越多。并考虑区分大小写,例如"Choose books" 和 "choose books"

小心非常小的单词,比如将 "one" 替换为 "two",那么 "error-phrone" 将变为 "error-phtwo"