Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript匹配和RegExp问题--奇怪的行为_Javascript_Jquery_Regex - Fatal编程技术网

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

Javascript匹配和RegExp问题--奇怪的行为,javascript,jquery,regex,Javascript,Jquery,Regex,我一直在尝试使用一个简单的jQuery操作来动态匹配和存储页面上的所有锚标记及其文本。但我发现了一种奇怪的行为。使用match()或exec()时,如果将指针指定为单独的RegExp对象或模式变量,则查询只匹配haystack中几十个实例中的一个实例 如果你这样指定图案 match(/needle/gi) 然后它匹配针的每个实例 这是我的密码 你甚至可以点燃Firebug并在本页的这里尝试这段代码 var a = {'text':'','parent':[]}; $("a").each(

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

regex2是一个字符串,不是RegExp,我在使用这种语法时也遇到了麻烦,尽管我不太清楚它的行为


编辑:Remebered:对于regex2,JS将“/b/”视为一个指针,而不是“b”。

regex2是一个字符串,不是RegExp,我在使用这种语法时也遇到了问题,尽管我对其行为不太确定


编辑:Remebered:对于regex2,JS将“/b/”视为指针,而不是“b”。

这根本不是异常行为。在regex1中,您只检查它的一个实例,而在regex3中,您告诉它使用/gi参数返回该项的所有实例

在regex2中,假设“/b/”==/b/,而实际情况并非如此。“/b/”!==/b/。“/b/”是一个正在搜索的字符串,因此如果字符串中有“/b/”,它将返回,而/b/意味着它需要在斜杠之间搜索,以便有“abc”,它将返回“b”

我希望这有帮助

编辑:

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);
}
再仔细研究一下,
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功夫显然不够强大,无法回答这一部分,这根本不是什么不寻常的行为。在regex1中,您只检查它的一个实例,而在regex3中,您告诉它使用/gi参数返回该项的所有实例

在regex2中,假设“/b/”==/b/,而实际情况并非如此。“/b/”!==/b/。“/b/”是一个正在搜索的字符串,因此如果字符串中有“/b/”,它将返回,而/b/意味着它需要在斜杠之间搜索,以便有“abc”,它将返回“b”

我希望这有帮助

编辑:

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);
}
再仔细研究一下,
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功夫显然不够强大,无法回答这一部分的问题。regex 2返回null的原因是您将“/b/”作为模式参数传递,而“b”实际上是模式的唯一部分。斜杠是regex的简写,就像[]是数组一样。因此,如果将其替换为新的正则表达式(“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));

regex2返回null的原因是您将“/b/”作为模式参数传递,而“b”实际上是模式的唯一部分。斜杠是regex的简写,就像[]是数组一样。因此,如果将其替换为新的正则表达式(“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));

a.texta只是一个包含两个元素的对象。我在代码的顶部定义了它。它的上下文可能是document对象。a.texta的内容是什么?a只是一个包含两个元素的对象。我在代码的顶部定义了它。它的上下文可能是document对象,但是regex1呢?这应该奏效。你是如何解决你的问题的?但是regex1呢?这应该奏效。你是怎么解决你的麻烦的?我应该说清楚的。对于regx1,当我在RegExp对象的定义中添加“gi”时,这并没有什么区别。你自己试试。你知道为什么会这样吗?我确实在RegExp定义中添加了g标志,所以它应该进行全局匹配,对吗?我应该说清楚。对于regx1,当我在RegExp对象的定义中添加“gi”时,这并没有什么区别。你自己试试。你知道为什么会这样吗?我确实在RegExp定义中添加了g标志,所以它应该进行全局匹配,对吗?