我有一堆文本(来自维基百科),我需要扫描它以获取引用,可以采用以下三种形式中的任何一种:
<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循环第一次运行正常,但在第二次运行时它失败了!我认为它与第二次引用的单引号有关,但后来我尝试改变它们的顺序,但第二次运行时循环仍然失败!
答案 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处执行的代码略有修改。