2017-03-19 42 views
0

在這裏,我有一個測試字符串:如何從結果的正則表達式的詳細信息的JavaScript

apple 01x100 02x200 03x150 
banana 01x50 02 03x10 

我要的是結果:

{ "apple" : { "100":["01"], "200":["02"], "150":["03"] }, 
    "banana" : {"50":["01"], "10":["02","03"]} 

我試圖用正則表達式的JavaScript解析串。正則表達式字符串

/(apple|banana)((?:\s)*(?:(?:[0-9]+)(?:\s)*)*x(?:[0-9])+)+/gi 

結果:

Match 1 
Full match 0-26 `apple 01x100 02x200 03x150` 
Group 1. 0-5 `apple` 
Group 2. 19-26 ` 03x150` 

Match 2 
Full match 27-48 `banana 01x50 02 03x10` 
Group 1. 27-33 `banana` 
Group 2. 39-48 ` 02 03x10` 

正如你看到的,在比賽1 - 2組,只有03x150顯示,01x100和02x200沒有。在完全匹配中顯示全部。任何想法解決這個問題,並得到我想要的結果?由於

+0

什麼是由'02'獲取與關鍵'10'最終輸出相關聯的規則? –

+0

01表示質量類型,100表示​​數量。另外,02意味着質量,10意味着數量。在這種情況下,香蕉類型02和03獲得相同的數量 – boygiandi

回答

0

我認爲這會爲你工作:

const input = ` 
 
apple 01x100 02x200 03x150 
 
banana 01x50 02 03x10 
 
lemon 02x12 15 16 17x21 
 
` 
 

 
const parse = data => { 
 
    const obj = {} 
 
    const findFruits = /(\w+)\s+(.*)/g 
 
    const findMore = /\s*([\d\s]+)x(\d+)/g 
 
    let temp 
 
    while (temp = findFruits.exec(data)) { 
 
     const tempObj = obj[temp[1]] = {} 
 
     const temp2 = temp[2] 
 
     while (temp = findMore.exec(temp2)) { 
 
      tempObj[temp[2]] = temp[1].split(' ') 
 
     } 
 
    } 
 
    return obj 
 
} 
 

 
const out = parse(input) 
 
console.log(out)

+0

我看到這個想法多次運行正則表達式,而不是一次 – boygiandi