javascript - 当搜索字符串在 typescript/javascript 中包含通配符时搜索数组?
问题描述
我有一系列电话号码。我还有一个搜索字符串。搜索字符串由用户提供。搜索字符串可以包含通配符,例如星号 (*) 或问号 (?)。我需要一种方法来过滤掉我的电话号码数组中的元素。
The following is my phone number array.
let mobileNumbersArray = ["830456481", "831456481", "9886503103" ]
**Condition 1**
when search string is *
let searchString = "*"
expected result = ["830456481", "831456481", "9886503103"]
**Condition 2**
when search string is 83*
let searchString = "83*"
expected result = ["830456481", "831456481"]
**condition 3**
let searchString = "*456*"
expected result = ["830456481", "831456481"]
**condition 4**
exact search
let searchString = "9886503103"
expected result = ["9886503103"]
**condition 5**
exact search
let searchString = "83?4"
expected result = ["830456481", "831456481"]
我怎样才能在我的电话号码数组上搜索一个字符串,并以尽可能最干净的方式将结果作为一个数组获取。
感谢任何帮助
谢谢你 。
解决方案
我想我可能有一个有趣的解决方案。请查看以下代码段,让我知道它是否适合您。
你可以阅读 MDN 上的正则表达式。
然后关于RegExp 构造函数。这是关键。不是每个人都知道您可以动态生成正则表达式。
更新:
这个想法是将“通配符”语法转换为 RegExp 语法,如下所示:
?
表示:“任何单个数字”,在 RegExp 中:[0-9]
或\d
*
表示:“一个或多个数字”,在 RegExp 中:(.+
实际上这意味着一个或多个“任何东西”)
这就是为什么我在将查询提供给 RegExp 构造函数之前在开始时进行双重替换的原因。
最后,是的,这可以扩展到使用非数字字符。替换[0-9]
为.
function queryNumbers(array, query) {
const src = query.replace(/\?/g, '[0-9]').replace(/\*/g, '.+');
const regexp = new RegExp('^' + src + '$');
return array.filter((item) => regexp.test(item));
}
const mobileNumbersArray = ['830456481', '831456481', '9886503103'];
console.log(queryNumbers(mobileNumbersArray, '*'));
console.log(queryNumbers(mobileNumbersArray, '83*'));
console.log(queryNumbers(mobileNumbersArray, '*456*'));
console.log(queryNumbers(mobileNumbersArray, '9886503103'));
console.log(queryNumbers(mobileNumbersArray, '83?4*'));
console.log(queryNumbers(mobileNumbersArray, '8*'));