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

时间:2016-08-12 09:34:44

标签: regex string replace str-replace

我正在开发一个基本上通过文本替换翻译网站UI的扩展程序。我使用this article作为基础,但我遇到了一个小问题:

为简单起见,我想说我想将“书籍”翻译为“礼物”。因此,使用文章中的模板,我写道:

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

但我还想翻译另一个字符串:“选择书籍”到“选择礼物”。所以我写下以下内容:

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

字符串“选择书籍”被替换为“选择礼物”,而不是用预期的“选择礼物”替换整个字符串。

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

2 个答案:

答案 0 :(得分:3)

  

我知道字符串命令会考虑到顺序,但是无论如何都要忽略它?

没有。每个v = v.replace("Choose books", "Select presents").replace("books", "presents"); 调用("字符串命令")是独立的并创建一个新字符串,然后在该新字符串上调用下一个方法。你不能忽视这一点。

  

正则表达式标志可能与它有关吗?

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

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

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

一个替代方案,可能就是你所说的"正则表达式标志",是一次性完成所有替换。您可以使用replacement callback选择正确的新表达式:

campers

答案 1 :(得分:1)

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

  • “选择带主题的图书”=> “选择带有类别的礼物”
  • “选择书籍”=> “S
  • “选择礼物”“选择”=> “选择”

但是你自动替换的字符串越小,进程将替换你不想替换的字符串的错误就越多。并考虑区分大小写,例如“选择书籍”和“选择书籍”

要小心非常小的单词,比如将“one”替换为“two”,然后“error-phrone”将变为“error-phtwo”