字符串模糊匹配正则实现(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('.*')
  );
};

你可能感兴趣的:(js系列,javascript,前端,开发语言)