1

我有一个这种类型的 JSON 数组:

[ 
  { text: '[Chapter1](chapter1.html)'},
  { text: '[Chapter2](chapter2.html)'},
  { text: '[Chapter3](chapter3.html)'},
  { text: '[Chapter4](chapter4.html)'}
]

为了尝试遍历数组并获取括号中的文本(Chapter1、Chapter2 等),我在 StackOverflow 找到了一个 RegExp

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)' ]

我错过了什么?我很讨厌正则表达式。

4

3 回答 3

1

exec正则表达式的方法不仅返回匹配的文本,还返回很多其他信息,包括输入、匹配索引、匹配文本和所有捕获组的文本。您可能需要匹配组 1:

result.push(sectionRegex.exec(aResponse[x].text)[1]);

除此之外,您不应该使用for(...in...)循环来遍历数组,因为如果将任何方法添加到Array's中就会中断prototype。(例如,forEach垫片)

于 2012-12-14T04:51:59.723 回答
0

不像你想象的那么奇怪,每个regex.exec结果实际上是一个看起来像其中一个块的对象,它包含匹配的整个文本,匹配的子组(你只有一个子组,这是你真正想要的结果),索引匹配成功的输入和给出的输入。

所有这些都是成功匹配的有效和有用的结果。

简短的回答,您是否只想将第二个数组元素推送到结果中。
喜欢regex.exec(text)[1]

于 2012-12-14T04:51:28.850 回答
0

您使用的正则表达式将返回一个数组。第一个元素将是要测试的字符串。下一个元素将是括号之间的匹配试试这个:

result.push(sectionRegex.exec(aResponse[x].text)[1]); 
于 2012-12-14T04:52:50.573 回答