JS从字符串中使用“ new RegExp()”删除非字母字符

时间:2018-07-16 15:28:21

标签: javascript regex ecmascript-6

我有一个搜索输入,可让我根据用户输入的内容过滤列表的结果。 尽管我想同时从搜索输入和列表中删除所有非字母字符,所以它们可以找到匹配项。

这是我目前拥有的:

let searchInput = '' // whatever the user types

let result = list.filter(element => element.name.match(new RegExp(searchInput, 'i')))
    .sort((a, b) => true * a.name.localeCompare(b.name))

1 个答案:

答案 0 :(得分:1)

您可以使用正则表达式/[\W_]+/替换非单词字符。

不清楚是要替换现有数据还是创建新的过滤列表。我以后再假设。

首先使用map()创建一个列表,其中删除了非单词字符,然后从搜索输入中删除了非单词字符。然后只是过滤。您可以根据需要将它们链接起来:

let searchInput = 'he*(llo' // whatever the user types

let list = [
   {name: '#hello'},
   {name: 'he$llo'},
   {name: 'someevalue'},
   {name: 'what'},
   {name: 'hello%'}

]

let re = new RegExp(/[\W_]+/i)
let cleaned_list = list.map(i => (i.name = i.name.replace(re, ''), i))
let cleaned_input = searchInput.replace(re, '')
let result = cleaned_list.filter(element => element.name.match(new RegExp(cleaned_input)))

console.log(result)

如果您只想基于不包含非字符词的字符串进行匹配,而又想在最终结果中使用原始术语,请不要先清除列表,而只需在过滤时清除每个元素即可:

let searchInput = 'he*(llo' // whatever the user types

let list = [
   {name: '#hello'},
   {name: 'he$llo'},
   {name: 'someevalue'},
   {name: 'what'},
   {name: 'hello%'}

]
let re = new RegExp(/[\W_]+/i)
let cleaned_input = searchInput.replace(re, '')
let result = list.filter(element => element.name.replace(re, '').match(new RegExp(cleaned_input)))
console.log(result)