2009-07-16 40 views
1

我一直在嘗試使用簡單的jQuery操作來動態匹配和存儲頁面上的所有錨標籤及其文本。但我發現了一個奇怪的行爲。當你使用match()或exec()時,如果你指定針作爲一個單獨的RegExp對象或模式變量,那麼你的查詢只能在乾草堆中匹配數十個實例。Javascript匹配和RegExp問題 - 奇怪行爲

如果你指定這樣

match(/needle/gi) 

模式則針的每個實例相匹配。

這是我的代碼。

你甚至可以啓動Firebug並在此頁面上嘗試此代碼。

var a = {'text':'','parent':[]}; 

$("a").each(function(i,n) { 

    var module = $.trim($(n).text()); 
    a.text += module.toLowerCase() + ',' + i + ','; 

    a.parent.push($(n).parent().parent()); 

}); 

var stringLowerCase = 'b'; 

var regex = new RegExp(stringLowerCase, "gi"); 
//console.log(a.text); 
console.log("regex 1: ", regex.exec(a.text)); 

var regex2 = "/" + stringLowerCase + "/"; 
console.log("regex 2: ", a.text.match(regex2)); 

console.log("regex 3: ", a.text.match(/b/gi)); 

對我來說,它返回:

regex 1: ["b"] 
regex 2: null 
regex 3: ["b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b", "b"] 

任何人都可以解釋這種行爲的根源在哪裏?

編輯:我忘了提及,對於regex1,不管是否爲全局和不區分大小寫的匹配添加標誌「gi」都沒有什麼區別。它仍然只返回一場比賽。

EDIT2:解決了我自己的問題。我仍然不知道爲什麼一個regex1只匹配一個實例,但我設法匹配使用match()和regex1的所有實例。

因此,這個匹配所有動態!

var regex = new RegExp(stringLowerCase, "gi"); 
console.log("regex 2: ", a.text.match(regex)); 
+0

什麼是a.text – 2009-07-16 11:35:18

+0

一個的內容只是兩個元素的對象。我在代碼的頂部定義了它。它的上下文可能是文檔對象。 – picardo 2009-07-16 11:37:22

回答

4

這根本不是不尋常的行爲。在正則表達式1中,您只是檢查它的一個實例,在正則表達式3中,您已經通過使用/ gi參數告訴它返回該項目的所有實例。

在正則表達式2中,假設「/ b /」===/b /不是。 「/ b /」!==/b /。 「/ b /」是一個正在搜索的字符串,所以如果你的字符串中有「/ b /」,那麼它會返回,而/ b /意味着它需要在斜槓之間搜索,所以你可以有「abc」,它會返回「b」

我希望有幫助。

編輯:

尋找到它有點多,該exec方法返回它找到,而不是它找到的所有比賽的第一場比賽。

編輯:

var myRe = /ab*/g; 
var str = "abbcdefabh"; 
var myArray; 
while ((myArray = myRe.exec(str)) != null) 
{ 
    var msg = "Found " + myArray[0] + ". "; 
    msg += "Next match starts at " + myRe.lastIndex; 
    console.log(msg); 
} 

在看看它再次,絕對不會返回第一個實例,它發現。如果你穿過它,那麼會返回更多。

爲什麼這樣做?我不知道...我的JavaScript功能顯然不足以回答那部分

0

regex2是一個字符串,而不是一個RegExp,我很難過使用這種語法,儘管我真的不知道該行爲。

編輯:Remebered:對於regex2,JS尋找「/ b /」作爲針,而不是「b」。

+0

但是,regex1呢?這應該起作用。你最終如何解決你的麻煩? – picardo 2009-07-16 11:39:49

2

正則表達式2返回null的原因是您傳遞「/ b /」作爲模式參數,而「b」實際上是唯一實際上是模式的一部分。斜槓是正則表達式的簡寫,就像[]是數組一樣。因此,如果您要將其替換爲新的正則表達式(「b」),您將得到一個匹配,但只有一個匹配,因爲您在該示例中省略了「global + ignorecase」標誌。要獲取#2,#3相同的結果,相應地修改:

var regex2 = stringLowerCase; 
console.log("regex 2: ", a.text.match(regex2, "gi")); 
console.log("regex 3: ", a.text.match(/b/gi));