2017-09-20 6 views
0

この問題の正しい言い回しを見つけるのに本当に苦労しています。答えはどこかに投稿されており、完全に理解していないことがわかります。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回目の試合でのみ一致するように見えますが、なぜそれが分かりませんか。

洞察力があれば幸いです。

+2

は単純なアプローチは、異なるセグメントを取得する期間に文字列を分割することではないでしょうか? https://jsfiddle.net/g8acfL88/ – jas7457

+1

私はそれを見つけました...私も混乱しました:https://stackoverflow.com/questions/11477415/why-does-javascripts-regex-exec-not-always-return- the-same-value – Isaac

+2

'g'修飾子を使わないでください。 – Barmar

答えて

0

あなたは、コレクションを結果から重複を削除する"foo"と文字列の最後に続いて一つ以上の単語文字が続く"."Setに一致するようにRegExp/^foo\.|\.\w+$/g、プロパティを反復する.map()、オブジェクトのプロパティ値を取得するためにObject.keys()を使用して、することができます正規表現オブジェクトであるように、配列

const o = { 
 
    'foo.bar.bar': 'test', 
 
    'foo.bar.baz': 'test', 
 
    'foo.baz.bar': 'test', 
 
    'foo.baz.baz': 'test', 
 
    'foo.bam.bar': 'test' 
 
} 
 

 
let matches = [...new Set(Object.keys(o).map(prop => 
 
       prop.replace(/^foo\.|\.\w+$/g, "")))]; 
 

 
console.log(matches);

1

からSetが見える変換ステートフル:

var myRegex = /foo\.([^\.]*)\./g; 

console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 
console.log(myRegex.exec("foo.bar.bar")) 

(2) ["foo.bar.", "bar", index: 0, input: "foo.bar.bar"] 
null 
(2) ["foo.bar.", "bar", index: 0, input: "foo.bar.bar"] 
null 
(2) ["foo.bar.", "bar", index: 0, input: "foo.bar.bar"] 
null 
(2) ["foo.bar.", "bar", index: 0, input: "foo.bar.bar"] 
null 
(2) ["foo.bar.", "bar", index: 0, input: "foo.bar.bar"] 
+0

バマールがg修飾語で述べたように鍵がありました。それを取り除くことを目的とした作品。 –