首页 > 解决方案 > 当搜索字符串在 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"]

我怎样才能在我的电话号码数组上搜索一个字符串,并以尽可能最干净的方式将结果作为一个数组获取。

感谢任何帮助

谢谢你 。

标签: javascripttypescript

解决方案


我想我可能有一个有趣的解决方案。请查看以下代码段,让我知道它是否适合您。

你可以阅读 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*'));


推荐阅读