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くださいprototype。(例:forEachシム)

于 2012-12-14T04:51:59.723 に答える
0

あなたが思うほど奇妙ではありませんが、各regex.exec結果は事実上、これらのブロックの 1 つのように見えるオブジェクトであり、一致したテキスト全体、一致したサブグループ (サブグループは 1 つしかなく、実際に必要な結果です)、その中のインデックスが含まれます。マッチが成功したという入力と与えられた入力。

これらはすべて、マッチの成功による有効で有用な結果です。

短い答えは、2 番目の配列要素のみを結果にプッシュすることです。
のように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 に答える