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