我正在开发一个基本上通过文本替换翻译网站UI的扩展程序。我使用this article作为基础,但我遇到了一个小问题:
为简单起见,我想说我想将“书籍”翻译为“礼物”。因此,使用文章中的模板,我写道:
v = v.replace("books", "presents");
但我还想翻译另一个字符串:“选择书籍”到“选择礼物”。所以我写下以下内容:
v = v.replace("books", "presents");
v = v.replace("Choose books", "Select presents");
字符串“选择书籍”被替换为“选择礼物”,而不是用预期的“选择礼物”替换整个字符串。
我在这里缺少什么?我知道字符串命令会考虑到顺序,但是无论如何都要忽略它?正则表达式标志可以与它有关吗?
答案 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)
您应首先替换更具体的字符串(或最长的字符串),例如
但是你自动替换的字符串越小,进程将替换你不想替换的字符串的错误就越多。并考虑区分大小写,例如“选择书籍”和“选择书籍”
要小心非常小的单词,比如将“one”替换为“two”,然后“error-phrone”将变为“error-phtwo”