介绍
- 当用户输入
ca
的时候,如何以正则匹配上china
、Canada
、colombia
、Cocos....(ya Kongo)
、congo....(Congo-Brazzaville)
等国家名字呢?请看本文以正则模式实现 - 主要逻辑是利用eval生成相应的正则表达式。
实现
- 生成模糊匹配规则;(js)
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()))
console.log(createFuzzyMatchingReg('ca').test('Canada'.toLocaleLowerCase()))
console.log(createFuzzyMatchingReg('ca').test('colombia'.toLocaleLowerCase()))
console.log(createFuzzyMatchingReg('ca').test('Cocos....(ya Kongo)'.toLocaleLowerCase()))
console.log(createFuzzyMatchingReg('ca').test('congo....(Congo-Brazzaville)'.toLocaleLowerCase()))
console.log(createFuzzyMatchingReg('()').test('中国'))
console.log(createFuzzyMatchingReg('()').test('(中国)'))
console.log(createFuzzyMatchingReg('+').test('(中国)'))
console.log(createFuzzyMatchingReg('').test('(中国)'))
- (ts)
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;
};
优化
- 使用
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('.*')
);
};