2017-04-11 80 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) –