簡體   English   中英

有人可以解釋這個數組的正則表達式過濾

[英]Can someone please explain this regex filtering of an array

我正在過濾一個數組,並在這里找到一個正則表達式。 我試圖理解這個:

filterArray.filter(/./.test.bind(new RegExp(key, 'g')))

但是我不明白數組如何測試它對正則表達式的價值,或者為什么你必須從/./開始而不是只寫正則表達式。 在這種情況下綁定是如何工作的?

編輯:鍵只是一個我要匹配的字符串,“嗨”或“狗”或“任何真的”。

.bind()方法將返回一個函數,其中包含您傳遞的任何內容,作為第一個參數綁定為this的值。

因為你從.test()調用.bind() ,所以你得到的是.test()方法,並將this綁定到new RegExp(key, 'g')

/./在這里無關緊要。 這只是獲得RegExp.prototype.test方法的RegExp.prototype.test方法。

結果是你將有效地做:

var regexp = new RegExp(key, 'g');

filterArray.filter(function(val) {
    return regexp.test(val);
});

您應該注意這有點危險,因為具有g修飾符的正則表達式對象是有狀態的。 這意味着它總是開始一個新的搜索,前一個搜索停止。

鑒於這種過濾方案, g似乎根本不需要,並且實際上只會導致問題。

這里有一個使用g的危險的例子:

var re = /./.test.bind(new RegExp("foo", 'g'));
var str = "foobar";

console.log(re(str));  // true
console.log(re(str));  // false

因此,在同一個字符串上調用相同的正則表達式會產生兩個不同的結果。 如果我們再次召集它,它將再次成為true


因此,如果使用.filter()回調,讓我們說key"foo" ,那么可以說一個val"foobar" 它將被允許通過過濾器。

但是,讓我們說下一個val"foobaz" 搜索將在第四個字符上重新開始,而不是從第一個字符開始,因此將找不到"foo"


以下是顯示實際問題的具體示例:

演示: http //jsfiddle.net/s9PzL/

var filterArray = [
    "foobar",
    "foobaz",
    "foobuz",
    "foobix"
];

var result = filterArray.filter(/./.test.bind(new RegExp("foo", 'g')));

所有字符串都有"foo" ,所以它們都應該通過。 但結果表明不會發生。

document.body.textContent = result.join(", "); // foobar, foobuz

我認為這樣做的原因是因為你想對數組中的每個項執行測試方法。 只是將測試方法傳遞給過濾器(可能)會搞亂方法的綁定。

這就是你的例子中的原因:

/./

生成一個空的正則表達式

/./.test

是該正則表達式的測試方法

/./.test.bind(new Regex(..))

將該方法綁定到所請求的方法,並返回一個執行test的新方法,其中this是您提供的基於key正則表達式。

它似乎可以寫得更清楚:

RegExp.prototype.test.bind(new RegExp(key, 'g'))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM