亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

使用字符串變量即時創建RegExps

使用字符串變量即時創建RegExps

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

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


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

TA貢獻1851條經驗 獲得超3個贊

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


查看完整回答
反對 回復 2019-10-19
  • 3 回答
  • 0 關注
  • 556 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號