2011-06-11 53 views
15

在Perl正則表達式中,您可以圍繞一個子表達式\Q\E來指示您希望該子表達式作爲文字字符串進行匹配,即使存在那裏有元字符。您還有quotemeta函數,它可以在一個字符串中正確插入正確數量的反斜槓,這樣,如果隨後將該字符串插入正則表達式中,則無論其內容如何,​​它都將按字面順序匹配。Javascript等價於Perl的 Q ... E或quotemeta()

Javascript(如在主流瀏覽器中部署)是否有任何內置等效?我可以寫我自己的很好,但我想知道如果我不必打擾。

回答

14

沒有這樣的內置功能。

而不是實現你自己的,我建議你看看互聯網上提供的衆多regex escape functions

該頁面提出如下解決方案(由Colin Snover):

RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
} 

或建議使用XRegExp庫。

+3

謝謝。請注意任何點擊鏈接的人:請閱讀底部的*正確*版本的例程。 – zwol 2011-06-13 17:19:20

5

Quotemeta本身並不實現爲據我所知,但我這個在幾個月前用於僅此:

function quotemeta (str) { 
    // http://kevin.vanzonneveld.net 
    // + original by: Paulo Freitas 
    // *  example 1: quotemeta(". + * ?^($)"); 
    // *  returns 1: '\. \+ \* \? \^ \(\$ \)' 
    return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1'); 
} 

http://phpjs.org/functions/quotemeta:496

+0

愛好漂亮直截了當的執行 – ZJR 2012-02-01 01:55:36

1

還有一個quotemeta npm module,你可以在node.js或瀏覽器中使用。實現是引用所有非單詞字符(簡寫爲[^a-zA-Z0-9_])。

String(str).replace(/(\W)/g, '\\$1'); 

這是可行的,因爲所有需要轉義的字符都是非單詞,而其他轉義字符則無害。例如,這裏百分號被逃了出來,但它仍然正常匹配的正則表達式,但它並不需要進行轉義:

if ("Hello%".match(RegExp(String("%").replace(/(\W)/g,'\\$1')))) { console.log("matched!"); } 

```

有人分叉的quotemeta模塊注意,捕獲parens是不需要的,所以正則表達式可以進一步簡化如下:

String(str).replace(/\W/g, '\\$&'); 
+1

請注意,這將打破代理對中間反斜槓分開,破壞字符,如 – Kovensky 2016-11-17 12:11:01

+0

如果有解決方案,請提交一個PR到quotemeta模塊並編輯這個答案。 – 2016-11-17 15:33:41