我一直在尝试使用一个简单的 jQuery 操作来动态匹配和存储页面上的所有 anchor 标记及其文本。但是我发现了一个奇怪的行为。当您使用 match() 或 exec() 时,如果您将指针指定为一个单独的 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));
最佳答案
这根本不是异常行为。在正则表达式 1 中,您只检查它的 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 功夫显然不足以回答那部分
关于Javascript 匹配和 RegExp 问题——奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1136954/