【问题标题】:.match() is including everything, not only the caturing groups (Javascript).match() 包括所有内容,而不仅仅是 caturing 组(Javascript)
【发布时间】:2015-09-26 16:23:54
【问题描述】:

我正在尝试解析 robots.txt 文件,我想获取字符之间的所有内容:User-agent:\n,我正在使用以下正则表达式:

/User-agent: (.*)\n/g

这个正则表达式的唯一捕获组是 (.*),它捕获除换行符之外的每个字符,但是当我运行时:

var exampleString = 'User-agent: example\n'
var matches = exampleString.match(/User-agent: (.*)\n/g);

matches[0]User-agent: example\n。匹配不应该只返回捕获组而不是正则表达式中的所有内容吗?我也尝试过使用这样的非捕获组:/(?:User-agent: )(.*)(?:\n)/g,同样的事情发生了。

如何只捕获User-agent: 之后和\n 之前的名称?

【问题讨论】:

  • 你看到的是正常的 match() 行为。请RTFM.
  • /User-agent: (.*)\n/g.exec(exampleString) 返回一个数组 [ "User-agent: example ", "example" ]
  • 这些答案是否解决了您的问题?如果是这样,请通过选中该答案左侧的绿色复选标记将最佳答案标记为已接受答案,以向社区表明您的问题已得到解答,然后您和提供答案的人都将获得一些声誉积分这可以在 StackOverflow 上获得更多特权。

标签: javascript regex


【解决方案1】:

您应该使用RegExp object,它的exec 方法。这样:

var matches = new RegExp(/User-agent: (.*)\n/g).exec("User-agent: example\n")

matches[0] 包含完整的字符串,在本例中为“User-agent: example\n”, matches[1] 包含第一个捕获组,因此是“示例”。

如果您有多个捕获组,则匹配数组中有一个新值,从 1 开始。

【讨论】:

  • RegExp.exec 在什么方面优于String.match?
  • 你需要添加额外的\来转义\n
  • @Touffy 你可以读到on the manual(你链接的那个),如果设置了 g 标志 String.match 不返回捕获组。所以有2个选项,OP可以去掉g标志(只有他可以)并使用String.match,否则他只能使用RegExp对象
  • 谢谢。当您声称“应该”使用什么时,编写这种解释会很有帮助:) 另外——为什么不使用正则表达式? (我的意思是,你确实使用了一个,但它包含在 RegExp 构造函数中,这似乎是多余的)
【解决方案2】:

使用g 标志时,.match() 的结果与没有g 标志的结果不同。这是因为你有一个返回的数组,但是太多的东西不能用g 标志放入其中。所以,.match() 选择不返回捕获的组匹配,只返回所有的多个完整匹配。

来自MDN's page on .match()

如果正则表达式包含 g 标志,则该方法返回一个 包含所有匹配子字符串而不是匹配对象的数组。 不返回捕获的组。

获取所有捕获组的方法是使用带有.exec()的循环:

var exampleString = 'User-agent: example\n';
var re = /User-agent: (.*)\n/g, match, matches = [];
while (match = re.exec(exampleString)) {
    matches.push(match[1]);
}
document.write(JSON.stringify(matches));

当然,由于您显示的字符串中实际上并没有多个匹配项,您也许可以通过从正则表达式中删除 g 标志来简化您的解决方案,然后您可以使用 .match() 获取捕获的组。

var exampleString = 'User-agent: example\n'
var matches = exampleString.match(/User-agent: (.*)\n/);
document.write(JSON.stringify(matches));

【讨论】:

    猜你喜欢
    • 2022-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多