この問題の正しい言い回しを見つけるのに本当に苦労しています。答えはどこかに投稿されており、完全に理解していないことがわかります。RegExp.prototype.exec()Javascript regex grouping strange behavior:2回目の試行でのみ一致する
文字列のキーを持つ大きなオブジェクトがあり、このパターンに従います。 "foo.bar.baz": 'test'
各セグメントは任意の長さであり、すべてのキーはfooで始まりますが、残りの部分は異なります。私はすべての中間セグメントの配列を構築する必要があります。この例では 'bar'です。これを行うには、私は単純な正規表現のグループを使用しています。
const myRegex = /foo\.([^\.]*)\./g
文字列は " "に続いてのfooで始まり、その後、次までのすべてをキャプチャします"。"。
上記のキーでオブジェクトを反復するたびに、重複を除いて、その都度、中間セクション(バー)を配列に追加したいと考えています。
for(const key in myObject){ //loop over each key in the object
const matches = []
match = myRegex.exec(key)
if (match) {
if (matches.indexOf(match[1]) === -1) { //exclude duplicates
matches.push(match[1])
}
}
奇妙な動作は、複数のオカレンスを持つすべての2番目のセグメントでのみ機能するという事実です。例えば、フォローオブジェクトを指定します。
{
'foo.bar.bar': 'test',
'foo.bar.baz': 'test',
'foo.baz.bar': 'test',
'foo.baz.baz': 'test',
'foo.bam.bar': 'test'
}
バーとbazだけが一致するようにプッシュされます。 foo.bam.baz: 'test'
がオブジェクトに追加されると、bamは一致して配列にプッシュされます。 foo.bar.x
またはfoo.baz.x
のいずれかが削除されている場合、そのキーは押されません。それは2回目の試合でのみ一致するように見えますが、なぜそれが分かりませんか。
洞察力があれば幸いです。
は単純なアプローチは、異なるセグメントを取得する期間に文字列を分割することではないでしょうか? https://jsfiddle.net/g8acfL88/ – jas7457
私はそれを見つけました...私も混乱しました:https://stackoverflow.com/questions/11477415/why-does-javascripts-regex-exec-not-always-return- the-same-value – Isaac
'g'修飾子を使わないでください。 – Barmar