gpt4 book ai didi

javascript - 匹配一个模式但只捕获它的一部分

转载 作者:行者123 更新时间:2023-11-28 08:36:17 25 4
gpt4 key购买 nike

我有一堆文本(来自维基百科),我需要扫描它以查找引用,引用可能采用以下三种形式中的任何一种:

<ref name="somename" />
<ref name='somename' />
<ref name=somename />

到目前为止我得到的是:

var matches = text.match( /<ref name=["|']?(.*)["|']? \/>/gi );

在某种程度上,它是有效的:它返回一个包含三个引用的数组。问题是我想要捕获的是引文中的名称,而不是引文本身。我认为通过在正则表达式中使用这些括号我将捕获名称,但看起来它不起作用。他们不是叫捕获括号吗?如何匹配引文,但捕获名称?非常感谢!

更新:我的代码尚未运行,因此我粘贴了一些上下文,看看是否有人可以帮助我找出哪里出错了...再次感谢!

var text = this.getTextFromTextarea();

//First look for all the citations
var citations = [];
var citationsRegExp = /<ref name=["|']?([^"']*)["|']? \/>/gi;
var matches = text.match( citationsRegExp );

//Then create an object for each citation and store it for later
for ( var i = 0; i < matches.length; i++ ) {
var citation = new Object();
citation.string = matches[ i ];
citation.name = citationsRegExp.exec( citation.string )[1];
citations.push( citation );
}

根据控制台,错误是“TypeError: Cannot read property '1' of null”,我已追踪到行 itation.name = itationsRegExp.exec( itation.string )[1]; 换句话说,exec 返回 null,只有在不匹配时才会发生这种情况。

从文本区域获取的文本正是这样:

<ref name="somename" />
<ref name='somename' />
<ref name=somename />

最奇怪的部分是 for 循环第一次运行良好,但第二次运行时失败了!我认为这与第二次引用的单引号有关,但后来我尝试更改它们的顺序,但第二次运行时循环仍然失败!

最佳答案

更新答案

已更新JSFiddle 。由于您想要全局匹配这些字符串,因此您必须循环遍历每个匹配项。如果您有任何疑问,请告诉我:

var citations = [],
citationsRegExp = /<ref name=["|']?([^"']*)["|']? \/>/gi,
text = $( 'textarea' ).val();

// Loop through every set of matches globally
while (matches = citationsRegExp.exec(text))
{
// Add object to array
citations.push({
string : matches[0], // entire match
name : matches[1] // first match group
});
}

console.log( citations );
// Array[3]
// 0: Object
// name: somename
// string: <ref name="somename" />
// 1: Object
// name: somename
// string: <ref name='somename' />
// 2: Object
// name: somename
// string: <ref name=somename />
<小时/>

旧答案

String.match()只会匹配整个正则表达式,因此您需要使用 RegExp.exec()获取包含匹配组的数组。

var regex = /<ref name=["|']?([^"']*)["|']? \/>/i;
var matches = regex.exec("<ref name=somename />");

console.log(matches[1]);
// somename

注意:我还将您的匹配组更改为 [^"']*,这样它就不会包含可选的尾随 '".稍微修改过的代码在JSFiddle .

关于javascript - 匹配一个模式但只捕获它的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21127469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com