Live2d Test Env

文字脱敏

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
}

以上。

posted @ 2024-02-28 11:27  致爱丽丝  阅读(19)  评论(0编辑  收藏  举报