文字脱敏
2024年2月28日
/**
* 将文本中特定关键词前面的指定数量的字符替换为指定的字符串。
* @param text - 待处理的文本。
* @param options - 选项对象,包括 keyword、replaceCount 和 replacement 字段。
* @param keyword - 要替换的关键词的正则表达式模式,默认为 '(市|县|区|同志)'。
* @param replaceCount - 要替换的字符数,默认为 2。
* @param replacement - 替换成的字符串,默认为 '*'。
* @returns 处理后的文本。
*/
function replacePrefix(text: string, options?: { keyword?: string, replaceCount?: number, replacement?: string }): string {
// 默认选项
const defaultOptions = {
keyword: '(市|县|区|同志)',
replaceCount: 2,
replacement: '*'
};
// 合并选项
const { keyword, replaceCount, replacement } = { ...defaultOptions, ...options };
// 构造正则表达式模式
const pattern = new RegExp(`(.{${replaceCount}})(${keyword})(?:(?!\\2).)*?`, 'g');
// 如果文本中不存在匹配模式,则直接返回原始文本
if (!pattern.test(text)) {
return text;
}
// 替换匹配的部分
const replacedText = text.replace(pattern, (match, p1, p2) => {
return replacement.repeat(replaceCount) + p2;
});
return replacedText;
}
// 测试
const text1 = '去问人体市去问人体区';
console.log(replacePrefix(text1)); // 输出: 去问**市去问**区
const text2 = '去问人体同志去问人体区';
console.log(replacePrefix(text2)); // 输出: 去问**同志去问**区
2024年2月29日
新需求:在剔除keyword词后仍需将指定词替换掉,因而取消掉if/else 确保文字在最终输出,中间增加各类参数以便进行再处理:
/**
* 将文本中特定关键词前面的指定数量的字符替换为指定的字符串。
* @param text - 待处理的文本。
* @param options - 选项对象,包括 keyword、replaceCount 和 replacement 字段。
* mismatchList: 当文本不符合keyword,但是又须将指定词替换为*时使用,如:将`福州`两字替换为**
* @param isNeedMismatchList - 是否确认mismatchList默认true,若为false,则当文本不符keyword会原文输出
* @returns 处理后的文本。
*/
export function replacePrefix(
text: string,
options?: {
keyword?: string
replaceCount?: number
replacement?: string
mismatchList?: string[]
},
isNeedMismatchList: boolean = true
): string {
// 默认选项
const defaultOptions = {
keyword: '(省|市|县|区|同志|任期|乡|镇|村|及|街道)',
replaceCount: 2,
replacement: '*',
mismatchList: ['福州']
}
// 合并选项
const { keyword, replaceCount, replacement, mismatchList } = { ...defaultOptions, ...options }
let resultStr = text
// 构造正则表达式模式
const pattern = new RegExp(`(.{${replaceCount}})(${keyword})(?:(?!\\2).)*?`, 'g')
if (pattern.test(text)) {
// 替换匹配的部分
const replacedText = resultStr.replace(pattern, (match, p1, p2) => {
return replacement.repeat(replaceCount) + p2
})
resultStr = replacedText
}
// 如果文本中不存在匹配模式,
// 如果文本中有`福州`,则替换为**
// 否则直接返回原始文本
if (!mismatchList.includes(resultStr) && isNeedMismatchList) {
//有匹配词
const regex = new RegExp(mismatchList.join('|'), 'g')
let match
while ((match = regex.exec(resultStr)) !== null) {
const stars = replacement.repeat(match[0].length)
resultStr = resultStr.replace(match[0], stars)
}
return resultStr
}
return resultStr
}
以上。