我一直在尝试使用简单的jQuery操作来动态匹配和存储页面上的所有锚标记及其文本。但我发现了一种奇怪的行为。当您使用match()或exec()时,如果将指针指定为单独的RegExp对象或模式变量,那么您的查询仅匹配haystack中的数十个实例。
如果你指定这样的模式
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 :(得分:4)
这根本不是异常行为。在正则表达式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功夫显然不足以回答那部分
答案 1 :(得分: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));
答案 2 :(得分:0)
regex2是一个字符串,而不是一个RegExp,我使用这种语法也遇到了麻烦,因为我不确定这种行为。
编辑:重新编号:对于regex2,JS将“/ b /”视为针,而不是“b”。