【发布时间】:2009-07-16 11:28:58
【问题描述】:
我一直在尝试使用一个简单的 jQuery 操作来动态匹配和存储页面上的所有锚标记及其文本。但我发现了一个奇怪的行为。当您使用 match() 或 exec() 时,如果您将 needle 指定为单独的 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 匹配所有实例。
所以..this 匹配所有动态!
var regex = new RegExp(stringLowerCase, "gi");
console.log("regex 2: ", a.text.match(regex));
【问题讨论】:
-
a.text的内容是什么
-
a 只是一个包含两个元素的对象。我在代码的顶部定义了它。它的上下文可能是文档对象。
标签: javascript jquery regex