2009-07-16 37 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));