第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用字符串變量即時創(chuàng)建RegExps

使用字符串變量即時創(chuàng)建RegExps

假設(shè)我想使以下內(nèi)容可重復(fù)使用:function replace_foo(target, replacement) {   return target.replace("string_to_replace",replacement);}我可能會做這樣的事情:function replace_foo(target, string_to_replace, replacement) {   return target.replace(string_to_replace,replacement);}使用字符串文字,這很容易。但是,如果我想對正則表達(dá)式更加棘手,該怎么辦?例如,說我要替換,而是 string_to_replace。本能地,我會嘗試通過以下方式擴(kuò)展上述內(nèi)容:function replace_foo(target, string_to_replace, replacement) {   return target.replace(/^string_to_replace/,replacement);}這似乎不起作用。我的猜測是它認(rèn)為string_to_replace是字符串文字,而不是代表字符串的變量。是否可以使用字符串變量即時創(chuàng)建JavaScript正則表達(dá)式?如果可能的話,這樣的事情會很棒:function replace_foo(target, string_to_replace, replacement) {   var regex = "/^" + string_to_replace + "/";   return target.replace(regex,replacement);}
查看完整描述

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);


查看完整回答
反對 回復(fù) 2019-10-19
?
皈依舞

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é)果。


查看完整回答
反對 回復(fù) 2019-10-19
  • 3 回答
  • 0 關(guān)注
  • 561 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號