匹配模式但只捕获其中的一部分

时间:2014-01-15 01:26:55

标签: javascript regex

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

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

到目前为止我得到的是:

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

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

更新:我的代码还没有工作,所以我粘贴了一些上下文,看看是否有人可以帮我看看我哪里出错了...再次感谢!

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:无法读取属性'1'的null”,我已追踪到citation.name = citationsRegExp.exec( citation.string )[1];的行,换句话说,exec返回null,只有在没有匹配时才会发生。

来自textarea的文本正是如此:

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

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

1 个答案:

答案 0 :(得分:0)

更新回答

更新了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()只会匹配整个RegEx,因此您需要使用RegExp.exec()来获取包含匹配组的数组。

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

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

注意:我还将您的匹配组更改为[^"']*,以便它不会包含可选的尾随'"。在JSFiddle处执行的代码略有修改。