3 回答

TA貢獻1798條經驗 獲得超3個贊
使用字符串文字,這很容易。
并不是的!該示例僅替換的第一個匹配項string_to_replace。通常,您希望替換所有出現的情況,在這種情況下,必須將字符串轉換為全局(/.../g)RegExp。您可以使用new RegExp構造函數從字符串執行此操作:
new RegExp(string_to_replace, 'g')
這樣做的問題是,字符串文字中的任何正則表達式特殊字符都將以其特殊方式運行,而不是普通字符。您必須反斜杠轉義他們以解決此問題。不幸的是,沒有內置函數可以為您執行此操作,因此您可以使用以下函數:
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
還要注意,當您使用RegExp in時replace(),替換字符串現在也具有特殊字符$。如果要$在替換文本中包含文字,也必須對此進行轉義!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(四個,$因為它本身就是一個替換字符串-啊?。?/p>
現在,您可以使用RegExp實現全局字符串替換:
function replace_foo(target, string_to_replace, replacement) {
var relit= escapeRegExp(string_to_replace);
var sub= escapeSubstitute(replacement);
var re= new RegExp(relit, 'g');
return target.replace(re, sub);
}
真痛苦 幸運的是,如果您要做的就是用正則字符串替換而無需使用正則表達式的其他部分,則有一種更快的方法:
s.split(string_to_replace).join(replacement)
...就這樣。這是一個常見的成語。
說我想替換掉string_to_replace之外的所有東西
這是什么意思,您想替換所有不參與字符串匹配的文本?^當然用替換不是,因為這^意味著字符串開始標記,而不是取反。^只是[]字符組中的一個否定項。也有負面的前瞻性(?!...),但是JScript中存在一些問題,因此通常應避免使用它。
您可以嘗試匹配字符串的“所有內容”,并使用函數丟棄匹配字符串之間的任何空字符串:
var re= new RegExp('(.*)($|'+escapeRegExp(string_to_find)+')')
return target.replace(re, function(match) {
return match[1]===''? match[2] : replacement+match[2];
});
再一次,拆分可能會更簡單:
var parts= target.split(string_to_match);
for (var i= parts.length; i-->0;)
if (parts[i]!=='')
parts[i]= replacement;
return parts.join(string_to_match);

TA貢獻1851條經驗 獲得超3個贊
正如其他人所說,請使用new RegExp(pattern, flags)
此操作。值得注意的是,您將字符串文字傳遞給此構造函數,因此每個反斜杠都必須轉義。例如,如果您想讓正則表達式與反斜杠匹配new RegExp('\\\\')
,則需要說,而正則表達式的文字只需是/\\/
。根據您打算如何使用它,您應該警惕在沒有適當的預處理(轉義特殊字符等)的情況下將用戶輸入傳遞給該函數,否則,您的用戶可能會得到一些非常意外的結果。
添加回答
舉報