【JS】用正则匹配实现模糊搜索

目录

一、前话

二、介绍一种正则表达式:正向预查(positive lookahead)

三、实现模糊搜索

一、前话

在前端实现搜索功能的时候,大家经常用到的字符串匹配方法有如下几种:

  • String.indexOf(search_str)
  • String.includes(search_str)
  • 哈希表【利用哈希表记录搜索字符串和目标字符串中对应的单词,作匹配统计】

但是,以上这些方法,当遇到需要搜索字符串输入的字符可以  不一定要连续才能匹配、不一定要大小写匹配、字符之间可以乱序匹配  的模糊搜索时刻,那么用上述方法会增加复杂度

这里我们用强大的  正则表达式,来处理能符合上述要求的模糊搜索功能

二、介绍一种正则表达式:正向预查(positive lookahead)

(?=) 执行正则表达式中的正向预查。正向预查是一种零宽度断言,它不消耗自身字符去匹配,而是用于查看字符串中的 当前位置 之后是否能够匹配指定的模式

*注意,这里正向预查的括号,代表里面的预查都是独立的,是接着外部正则表达式指向的位置来查的,所以当多个预查连续排列是,预查开始的位置不是上一个预查结束的位置,而是括号外部指向的、此时匹配到的位置。利用这个性质,我们可以实现模糊搜索要求的乱序字符匹配

正则表达式中,除了正向预查外,还有其他预查方式,作出一个补充:

1、正向肯定预查 (?=pattern) 表示的是从其当前位置开始,预测后面的字符串必须匹配上pattern
2、正向否定预查 (?!pattern) 表示的是从其当前位置开始,预测后面的字符串必须匹配不上pattern
3、反向肯定预查 (?<=pattern) 表示的是从其当前位置开始,预测前面的字符串必须匹配上pattern
4、反向否定预查 (?<!pattern) 表示的是从其当前位置开始,预测前面的字符串必须匹配不上pattern

 

三、实现模糊搜索

其实最难的部分就是知道正向预查,并用其实现乱序匹配。另外的不一定连续匹配的要求,其实也包含在乱序匹配之中;大小写模糊,也直接可以通过regExp的匹配模式实现。

另外值得注意的是,匹配上了字符,还要控制字符数量一定是相同的。这里我们用了哈希表统计字符个数,将同一个重复的字符,我们合并在同一个正向预查中比如,我们aaa搜索字符串,如果用预查表达式(?=.*a)(?=.*a)(?=.*a),就会导致目标字符串"pang"也能匹配上,原因就是正向预查的独立性,从而对相同字符无法控制数量!!正确写法应该是(?=.*a.*a.*a)

综上,代码如下:

 //搜索用户
    const searchUser = function () {
        //支持模糊搜索
        let pattr = "^"
        let pre_look = "(?=.*"

        let word_map: any = {}
        //统计字符表,使得不仅要匹配上字符,字符数量是相同的
        nameVal.trim().split("").forEach((word) => {
            let lower = word.toLowerCase()
            if (word_map[lower]) {
                word_map[lower]++
            }
            else {
                word_map[lower] = 1
            }
        })

        //构造模式匹配字符串
        Object.keys(word_map).forEach((key) => {
            let num = word_map[key]
            pattr += pre_look
            for (let i = 0; i < num; i++) {
                if (i !== 0) pattr += ".*"
                pattr += key
            }
            pattr += ")"
        })
        pattr += ".*"

        let reg = new RegExp(pattr, 'i')
        //筛选出username字符串满足匹配格式的对象
        let filterData = tableData?.filter((item) => {
            return reg.test(item.username)
        }
        )
        console.log(filterData)
    }

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
JavaScript中的正则模糊搜索可以用来检查一个字符或词组在字符串中是否存在。使用正则表达式可以进行灵活的匹配,从而提高搜索的准确性和效率。 在JavaScript中可以使用RegExp对象创建正则表达式。例如要查找一个字符串中是否含有某个字符或字符串,可以使用RegExp的test()方法,如下所示: var str = "This is a sample text."; var pattern = /sample/; if (pattern.test(str)) { console.log("The string contains the word 'sample'."); } else { console.log("The string does not contain the word 'sample'."); } 此处的pattern就是一个正则表达式,用来匹配字符串中是否含有单词"sample",如果匹配成功,则会输出"The string contains the word 'sample'.",否则输出"The string does not contain the word 'sample'."。 除了使用简单的字符串进行匹配外,还可以使用一些特殊的字符或符号,如"^"表示匹配字符串的开始,"$"表示匹配字符串的结束,"."表示匹配任意字符,"*"表示匹配0个或多个字符,"+"表示匹配1个或多个字符,"?"表示匹配0个或1个字符,"[]"表示匹配一组字符中的任意一个,"()"表示分组等等。通过组合使用这些符号,可以构建更加复杂的正则表达式,从而实现更加精确的匹配。 综上所述,使用JavaScript正则表达式进行模糊搜索可以方便快捷地查找字符串中是否包含某个字符或字符串,并且还可以通过灵活的正则表达式创建,实现更加精确的匹配

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

音仔小瓜皮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值