我有一个这种类型的JSON数组:
[
{ text: '[Chapter1](chapter1.html)'},
{ text: '[Chapter2](chapter2.html)'},
{ text: '[Chapter3](chapter3.html)'},
{ text: '[Chapter4](chapter4.html)'}
]
尝试循环播放数组并获取括号中的文本(第1章,第2章等)I found a RegExp here at StackOverflow。
var aResponse = JSON.parse(body).desc; // the array described above
var result = [];
var sectionRegex = /\[(.*?)\]/;
for(var x in aResponse) {
result.push(sectionRegex.exec(aResponse[x].text));
//console.log(aResponse[x].text) correctly returns the text value
}
console.log(result);
那应该打印:
["Chapter1","Chapter2","Chapter3","Chapter4"]
但是我在多个数组中得到奇怪的长结果:
[ '[Chapter1]',
'Chapter1',
index: 0,
input: '[Chapter1](chapter1.html)' ]
[ '[Chapter2]',
'Chapter2',
index: 0,
input: '[Chapter2](chapter2.html)' ]
[ '[Chapter3]',
'Chapter3',
index: 0,
input: '[Chapter3](chapter3.html)' ]
[ '[Chapter4]',
'Chapter4',
index: 0,
input: '[Chapter4](chapter4.html)' ]
我错过了什么?我吮吸regexps。
答案 0 :(得分:1)
The exec
method of regular expressions不仅返回匹配的文本,还返回许多其他信息,包括输入,匹配索引,匹配的文本和所有捕获的组的文本。您可能想要匹配组1:
result.push(sectionRegex.exec(aResponse[x].text)[1]);
除此之外,您不应该使用for(...in...)
循环来遍历数组,因为如果将任何方法添加到Array
的{{1}},这将会中断。 (例如,prototype
垫片)
答案 1 :(得分:0)
并不像你想象的那样奇怪,每个regex.exec
结果实际上是一个看起来像其中一个块的对象,它包含匹配的整个文本,子组匹配(你只有一个子组,结果就是结果)你真的想要),匹配成功的输入中的索引和给定的输入。
所有这些都是成功匹配的有效和有用的结果。
简短的回答是,您是否只想将第二个数组元素推入结果中
与regex.exec(text)[1]
一样。
答案 2 :(得分:0)
您使用的正则表达式将返回一个数组。 第一个元素是要测试的字符串。下一个元素将是括号之间的匹配 试试这个:
result.push(sectionRegex.exec(aResponse[x].text)[1]);