2017-04-11 77 views
0

我正在使用正則表達式用於過濾的自動完成功能。該過濾器的代碼目前是如下:正則表達式過濾器angular2

filterStates(val: string) { 
    return val ? this.states.filter(s => new RegExp(`^${val}`, 'gi').test(s.name)) 
       : this.states; 
    } 

} 

以上regex運行良好的數據結構,如:

states=[{"name":"Alaska",code:1234}, 
{"name":"Bulgaria",code:12345}, 
{"name":"Colarado",code:12346}, 
{"name":"New Jersey",code:12347}, 
] 

繼承人的工作plunker:https://plnkr.co/edit/Pf2pWeUYo2mt7VzwCDs2?p=preview

但現在人們在略有變化數據結構如下圖所示name

states=[{"name":"Alaska (AL)","code":1234}, 
{"name":"Bulgaria (BG)","code":12345}, 
{"name":"Colarado (CO)","code":12346}, 
{"name":"New Jersey (NJ)","code":12347}, 
] 

我無法弄清楚如何爲name生成regex。當談到正則表達式時,我是一個完整的noob。

任何幫助將不勝感激。

+0

此模式不起作用。它阻礙了正常的字符搜索。 –

+0

是否有必要使用REGEX?因爲你可以簡單地使用自定義管道進行操作。 –

+0

@WiktorStribiżew是的,只是看到了。它不工作。 –

回答

0

使用該正則表達式中提取狀態名稱(無需修整):^[\w ]+(?= \()

阿拉斯加(AL)=>匹配阿拉斯加

保加利亞(BG)=>匹配保加利亞

新澤西州=>匹配新澤西州

這裏是一個demo上regex101

其他可能性當你輸入

將匹配狀態更換

return val ? this.states.filter(s => new RegExp(`^[\w ]+(?= \()`, 'gi').test(s.name)) 
      : this.states; 

return val ? this.states.filter(s => (s && s.name && s.name.toLowerCase().substring(0, val.length) === val)) 
      : this.states; 

Here是plunker,嘗試鍵入一個然後l

+0

這完全匹配'name'。但似乎並沒有在plunker工作:https://plnkr.co/edit/Pf2pWeUYo2mt7VzwCDs2?p = preview –

+0

我已經添加了另一種方式來實現這一點(與演示plunker) –