2016-08-12 91 views
1

我正在開發基本上通過文本替換翻譯網站UI的擴展。我使用this article作爲基礎,但遇到了一個小問題:是否可以放棄替換字符串順序?

爲了簡單起見,我們假設我想將「books」翻譯爲「presents」。因此,使用模板從文章中,我寫的:

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

但還有另一種我想要翻譯的字符串:「選擇禮物」「點擊書」,以所以我寫了以下內容:

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

什麼情況是,字符串「選擇書」被以「選擇禮物」,而不是整個字符串替換與預期改爲「選擇的禮物。」

我在這裏錯過了什麼?我知道字符串命令會考慮到順序,但是無論如何要忽略它?正則表達式標誌可能與它有關嗎?

+2

交換替換,首先替換較長的字符串。 –

+1

您應該詳細闡述您的問題,然後將其作爲單獨問題發佈。請從這篇文章中刪除它。 –

回答

3

我知道字符串命令考慮到順序,但有無論如何忽略這一點?

號每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"; 
}); 
1

您應先更換更具體的絃樂第一(或最長),例如

  • 「選擇帶有主題的書」=> 「選擇有類別呈現」
  • 「選擇書」=>「S
  • 「選擇禮物」, 「選擇」=> 「選擇」

但是,您自動替換的字符串越小,過程將替換您不想替換的字符串的錯誤數越多。並考慮區分大小寫,例如「選擇書籍」和「選擇書籍」

是汽車非常小的單詞,如將「one」替換爲「two」,則「error-phrone」將變爲「error-phtwo」