Javascript 匹配和 RegExp 问题——奇怪的行为

标签 javascript jquery regex

我一直在尝试使用一个简单的 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/

相关文章:

javascript - Aurelia.js 中的 if 和 else

javascript - 如何动态改变DIV标签的CSS样式属性?

javascript - 嵌入与包含 Javascript 进行 DOM 交互?

javascript - 用 div 切换值

c# - 捕获所有符合正则表达式的组

c++ - 为什么我的程序不读消除左递归文法规则? C++

正则表达式没有两个连续的字符是相同的

javascript - 对象和哈希之间的区别?

jquery - 点击后如何自定义<a href ="#link">页内链接相对于页面顶部的位置?

jQuery 对每个元素的更改函数