在Perl正則表達式中,您可以圍繞一個子表達式\Q
和\E
來指示您希望該子表達式作爲文字字符串進行匹配,即使存在那裏有元字符。您還有quotemeta
函數,它可以在一個字符串中正確插入正確數量的反斜槓,這樣,如果隨後將該字符串插入正則表達式中,則無論其內容如何,它都將按字面順序匹配。Javascript等價於Perl的 Q ... E或quotemeta()
Javascript(如在主流瀏覽器中部署)是否有任何內置等效?我可以寫我自己的很好,但我想知道如果我不必打擾。
在Perl正則表達式中,您可以圍繞一個子表達式\Q
和\E
來指示您希望該子表達式作爲文字字符串進行匹配,即使存在那裏有元字符。您還有quotemeta
函數,它可以在一個字符串中正確插入正確數量的反斜槓,這樣,如果隨後將該字符串插入正則表達式中,則無論其內容如何,它都將按字面順序匹配。Javascript等價於Perl的 Q ... E或quotemeta()
Javascript(如在主流瀏覽器中部署)是否有任何內置等效?我可以寫我自己的很好,但我想知道如果我不必打擾。
沒有這樣的內置功能。
而不是實現你自己的,我建議你看看互聯網上提供的衆多regex escape functions。
該頁面提出如下解決方案(由Colin Snover):
RegExp.escape = function(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
}
或建議使用XRegExp庫。
Quotemeta本身並不實現爲據我所知,但我這個在幾個月前用於僅此:
function quotemeta (str) {
// http://kevin.vanzonneveld.net
// + original by: Paulo Freitas
// * example 1: quotemeta(". + * ?^($)");
// * returns 1: '\. \+ \* \? \^ \(\$ \)'
return (str + '').replace(/([\.\\\+\*\?\[\^\]\$\(\)])/g, '\\$1');
}
愛好漂亮直截了當的執行 – ZJR 2012-02-01 01:55:36
還有一個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, '\\$&');
請注意,這將打破代理對中間反斜槓分開,破壞字符,如 – Kovensky 2016-11-17 12:11:01
如果有解決方案,請提交一個PR到quotemeta模塊並編輯這個答案。 – 2016-11-17 15:33:41
謝謝。請注意任何點擊鏈接的人:請閱讀底部的*正確*版本的例程。 – zwol 2011-06-13 17:19:20