【问题标题】:Is it possible to forgo replace string order?是否可以放弃替换字符串顺序?
【发布时间】:2016-12-19 06:33:35
【问题描述】:

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

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

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

但我正在尝试翻译另一个字符串:“选择书籍”到“选择礼物”。所以我写了以下内容:

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

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

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

【问题讨论】:

  • 交换替换,先替换较长的字符串。
  • 您应该进一步详细说明您的附带问题,然后将其作为单独的问题发布。请将其从该帖子中删除。

标签: regex string replace str-replace


【解决方案1】:

我知道字符串命令会考虑顺序,但是有什么可以忽略的吗?

没有。每个replace 调用(“字符串命令”)都是独立的并创建一个新字符串,然后在该新字符串上调用下一个方法。你不能忽视这一点。

正则表达式标志是否与它有关?

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


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

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

另一种选择,可能就是您对“正则表达式标志”的意思,是一次进行所有替换。您可以使用replacement callback 来选择正确的新表达式:

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

【讨论】:

    【解决方案2】:

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

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

    但是您自动替换的字符串越小,该过程将替换您不想替换的字符串的错误电话越多。并考虑区分大小写,例如“选书”和“选书”

    注意非常小的单词,比如将“one”替换为“two”,那么“error-phrone”会变成“error-phtwo”

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 2015-08-05
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多