字符串模糊匹配正则实现(js,javascript)

介绍

  1. 当用户输入 ca 的时候,如何以正则匹配上chinaCanadacolombiaCocos....(ya Kongo)congo....(Congo-Brazzaville)等国家名字呢?请看本文以正则模式实现
  2. 主要逻辑是利用eval生成相应的正则表达式。

实现

  1. 生成模糊匹配规则;(js)
/**
 * 根据传递进来的值生成相应正则表达式
 * @param {string} search 
 * @returns {RegExp}
 */
const createFuzzyMatchingReg = (search) => {
  let reg = null;
  if (!search) return /^/;
  search = search.toLocaleLowerCase();
  const specialCharactersReg = /^[^a-z^A-Z^0-9^\u4e00-\u9fa5]/;
  eval(
    `reg = /${search
        .split('')
        .map((v) => (specialCharactersReg.test(v) ? `\\${v}` : v))
        .join('.*')}/`
  );
  return reg
}
console.log(createFuzzyMatchingReg('ca').test('china'.toLocaleLowerCase())) // true
console.log(createFuzzyMatchingReg('ca').test('Canada'.toLocaleLowerCase())) // true
console.log(createFuzzyMatchingReg('ca').test('colombia'.toLocaleLowerCase())) // true
console.log(createFuzzyMatchingReg('ca').test('Cocos....(ya Kongo)'.toLocaleLowerCase())) // true
console.log(createFuzzyMatchingReg('ca').test('congo....(Congo-Brazzaville)'.toLocaleLowerCase())) // true
console.log(createFuzzyMatchingReg('()').test('中国')) // false
console.log(createFuzzyMatchingReg('()').test('(中国)')) // true
console.log(createFuzzyMatchingReg('+').test('(中国)')) // false
console.log(createFuzzyMatchingReg('').test('(中国)')) // true
  1. (ts)
/**
 * 根据传递进来的值生成相应正则表达式
 * @param {string} search
 * @returns {RegExp}
 */
export const createFuzzyMatchingReg = (search: string) => {
  let reg: RegExp | null = null;
  reg = /^/;
  if (!search) return reg;
  search = search.toLocaleLowerCase();
  const specialCharactersReg = /^[^a-z^A-Z^0-9^\u4e00-\u9fa5]/;
  eval(
    `reg = /${search
      .split('')
      .map((v) => (specialCharactersReg.test(v) ? `\\${v}` : v))
      .join('.*')}/`
  );
  return reg;
};

优化

  1. 使用RegExp替换eval(性能不好),代码更简洁。
const createFuzzyMatchingReg = (search: string) => {
  if (!search) return /^/;
  const specialCharactersReg = /^[^a-z^A-Z^0-9^\u4e00-\u9fa5]/;
  search = search.toLocaleLowerCase();
  return new RegExp(
    search
      .split('')
      .map((v) => (specialCharactersReg.test(v) ? `\\${v}` : v))
      .join('.*')
  );
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值