使用Javascript进行括号正则表达式

时间:2012-12-14 04:29:27

标签: javascript regex

我有一个这种类型的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。

3 个答案:

答案 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]);