【问题标题】:Iterate through regular expression array in Javascript遍历Javascript中的正则表达式数组
【发布时间】:2012-07-15 11:28:45
【问题描述】:

如何使用 Regex 表达式数组并使用“exec”操作迭代该数组。我确实用各种正则表达式初始化了一个数组,如下所示:

var arrRegex = new Array(/(http:\/\/(?:.*)\/)/g, /(http:\/\/(?:.*)\/)/g);

现在我创建了一个执行此操作的 for 循环:

 for(i=0;i<arrRegex.length;i++){
     arrRegex[i].exec(somestring);
 }

问题是这似乎不起作用。我不想像这样硬编码使用它:

  (/(http:\/\/(?:.*)\/)/g).exec(somestring);

使用数组选项时,'.exec' 函数返回 null。当我使用硬编码选项时,它会根据需要返回匹配项。

【问题讨论】:

  • exec 不会返回应有的匹配项,但使用硬编码会返回。匹配 = null

标签: javascript regex arrays


【解决方案1】:

exec() 返回匹配项,因此您应该能够捕获它。

somestring = 'http://stackoverflow.com/questions/11491489/iterate-through-regular-expression-array-in-javascript';
var arrRegex = new Array(/(http:\/\/(?:.*)\/)/g, /(http:\/\/(?:.*)\/)/g);
for (i = 0; i < arrRegex.length; i++) {
    match = arrRegex[i].exec(somestring);
}

match是一个数组,结构如下:

{
    [0] = 'string matched by the regex'
    [1] = 'match from the first capturing group'
    [2] = 'match from the second capturing group'
    ... and so on
}

看看这个 jsFiddle http://jsfiddle.net/HHKs2/1/

您还可以使用test() 代替exec() 作为exec() != null 的简写。 test() 将根据正则表达式是否匹配字符串的一部分返回一个布尔变量。

【讨论】:

  • 我知道,它在硬编码时工作得很好,但是当我使用数组中的正则表达式时返回 null,就像你在代码中写的那样。我在chrome浏览器上使用它
  • 看一下我发布的jsFiddle链接,它使用数组方式并返回结果。还是您指的是从字符串初始化表达式?顺便说一句,您也可以使用test() 而不是exec() 作为exec() != null 的简写。 test() 将根据正则表达式是否匹配字符串的一部分返回一个布尔变量。
  • 如果你说的是对的,这里的test怎么会返回false:jsfiddle.net/IdanShechter/uLMBL
  • @Dareen:需要注意的是,match 仅在正则表达式非全局时才重新运行匹配组。如果正则表达式是全局的,它只返回一个完整匹配的数组。
  • @IdanShechter:那是因为exec() 修改了正则表达式对象的属性。请注意,如果您删除它,test() 将返回 true:jsfiddle.net/uLMBL/1
【解决方案2】:

您可能想要做的是捕获第一组:

for(i=0;i<arrRegex.length;i++){
  var someotherstring = arrRegex[i].exec(somestring)[1];
  // do something with it ...
}

顺便说一句:这是我的猜测,不确定您要做什么。但是,如果您尝试获取 URL 的主机名,则应使用 /(http:\/\/(?:.?)\/)/g。 .* 后面的问号使前面的量词 (*) 变得不贪婪。

【讨论】:

  • test()函数怎么会返回false,应该返回true,因为有匹配jsfiddle.net/IdanShechter/uLMBL
  • 好吧,您的代码在这里运行 - 即使在 Chrome 中也是如此。你能给我们更多的背景信息,比如exec() 结果的左手分配。或者您可以只提供您正在处理的实际相关代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-18
  • 2017-01-01
相关资源
最近更新 更多