JavaScript - filter with wildcard (*)

2020-06-30 03:57发布

I want to filter over a collection of items with an eventual wildcard.

Let's say, I have the following items:

const items = ['Banana', 'Apple', 'Melon']

I now want to filter with the following strings:

e

Expected output: None

*e

Expected output: Apple

*e*

Expected output: Apple, Melon

ana

Expected output: None

*ana

Expected output: Banana

*an

Expected output: none

*an*

Expected output: Banana

I hope you get my intention. Is there any smart way to do it with regex or standard JS functions / libraries? I couldn't find something so far.

标签: javascript
1条回答
家丑人穷心不美
2楼-- · 2020-06-30 04:57

You can construct a regular expression by replacing *s with .* to match any characters, and surround the wildcard string with ^ and $ (to match the beginning and the end):

const items = ['Banana', 'Apple', 'Melon']

const filterBy = str => items.filter(
  item => new RegExp('^' + str.replace(/\*/g, '.*') + '$').test(item)
);
console.log(filterBy('e'));
console.log(filterBy('*e'));
console.log(filterBy('*e*'));
console.log(filterBy('ana'));
console.log(filterBy('*ana'));
console.log(filterBy('*an'));
console.log(filterBy('*an*'));

Note that if the wildcard string ever has any other characters with a special meaning in a regular expression, you'll have to escape them first.

查看更多
登录 后发表回答