3 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個贊
使用字符串文字,這很容易。
并不是的!該示例僅替換的第一個匹配項(xiàng)string_to_replace。通常,您希望替換所有出現(xiàn)的情況,在這種情況下,必須將字符串轉(zhuǎn)換為全局(/.../g)RegExp。您可以使用new RegExp構(gòu)造函數(shù)從字符串執(zhí)行此操作:
new RegExp(string_to_replace, 'g')
這樣做的問題是,字符串文字中的任何正則表達(dá)式特殊字符都將以其特殊方式運(yùn)行,而不是普通字符。您必須反斜杠轉(zhuǎn)義他們以解決此問題。不幸的是,沒有內(nèi)置函數(shù)可以為您執(zhí)行此操作,因此您可以使用以下函數(shù):
function escapeRegExp(s) {
return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
}
還要注意,當(dāng)您使用RegExp in時replace(),替換字符串現(xiàn)在也具有特殊字符$。如果要$在替換文本中包含文字,也必須對此進(jìn)行轉(zhuǎn)義!
function escapeSubstitute(s) {
return s.replace(/\$/g, '$$$$');
}
(四個,$因?yàn)樗旧砭褪且粋€替換字符串-?。。?/p>
現(xiàn)在,您可以使用RegExp實(shí)現(xiàn)全局字符串替換:
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);
}
真痛苦 幸運(yùn)的是,如果您要做的就是用正則字符串替換而無需使用正則表達(dá)式的其他部分,則有一種更快的方法:
s.split(string_to_replace).join(replacement)
...就這樣。這是一個常見的成語。
說我想替換掉string_to_replace之外的所有東西
這是什么意思,您想替換所有不參與字符串匹配的文本?^當(dāng)然用替換不是,因?yàn)檫@^意味著字符串開始標(biāo)記,而不是取反。^只是[]字符組中的一個否定項(xiàng)。也有負(fù)面的前瞻性(?!...),但是JScript中存在一些問題,因此通常應(yīng)避免使用它。
您可以嘗試匹配字符串的“所有內(nèi)容”,并使用函數(shù)丟棄匹配字符串之間的任何空字符串:
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貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個贊
正如其他人所說,請使用new RegExp(pattern, flags)
此操作。值得注意的是,您將字符串文字傳遞給此構(gòu)造函數(shù),因此每個反斜杠都必須轉(zhuǎn)義。例如,如果您想讓正則表達(dá)式與反斜杠匹配new RegExp('\\\\')
,則需要說,而正則表達(dá)式的文字只需是/\\/
。根據(jù)您打算如何使用它,您應(yīng)該警惕在沒有適當(dāng)?shù)念A(yù)處理(轉(zhuǎn)義特殊字符等)的情況下將用戶輸入傳遞給該函數(shù),否則,您的用戶可能會得到一些非常意外的結(jié)果。
添加回答
舉報(bào)