You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js正则提取字符串姓名:适配多称谓格式代码优化需求

解决Node.js中提取姓名的正则匹配问题

你的getName函数已经有了基础框架,但目前卡在两个关键点:一是正则没法匹配Mr.、MR .这类不同格式的称谓,二是当前正则的结束条件和你的示例场景不匹配(比如示例里的MANOJ-THOMAS后面没有字母数字组合,导致原正则抓不到目标内容)。下面是调整后的完整解决方案:

1. 优化正则表达式

首先我们要修改正则,覆盖所有你提到的称谓格式,同时确保能正确捕获带连字符的姓名:

// 适配所有MR/Mr变体,捕获姓名直到行尾的版本(适合你的示例场景)
const nameRegexPattern = "MR\\.?\\s*(.*?)\\s*$";

正则各部分解释:

  • MR:匹配基础称谓,配合i修饰符自动兼容Mr、mr等大小写变体
  • \\.?:匹配可选的点(支持MR、MR.、Mr.格式)
  • \\s*:匹配点后零个或多个空格(支持MR .、MR. 、Mr.等带空格的格式)
  • (.*?):非贪婪捕获姓名内容(如果你的姓名只包含字母、连字符,可以改成([\\w-]+)更精准)
  • \\s*$:匹配姓名后可选空格直到行尾,确保捕获完整姓名

如果你确实需要保留原正则中"姓名后跟随字母数字组合"的结束条件,可以用这个版本:

const nameRegexPattern = "MR\\.?\\s*(.*?)\\s*(?:[a-zA-Z]+[0-9]|[0-9]+[a-zA-Z])";

注意:这个版本在你的示例字符串里会匹配失败,因为MANOJ-THOMAS后面没有符合条件的内容,请根据实际业务场景选择。

2. 优化getName函数

原函数存在多次重复创建正则实例、逻辑冗余的问题,我们简化逻辑并提升可读性:

function getName(narration1, narration2, regexList) {
  try {
    // 遍历正则列表,找到第一个能匹配任一文本的正则
    const matchedRegex = regexList.find(regexStr => {
      const regex = new RegExp(regexStr, 'i');
      return regex.test(narration1) || regex.test(narration2);
    });

    if (!matchedRegex) {
      console.log("No matching regex found");
      return 'NO_VALUE';
    }

    // 确定匹配成功的文本
    const targetNarration = new RegExp(matchedRegex, 'i').test(narration1) ? narration1 : narration2;
    // 执行匹配并提取姓名
    const matchResult = targetNarration.match(new RegExp(matchedRegex, 'i'));
    
    // 简化空值判断,返回处理后的姓名或默认值
    const name = matchResult?.[1]?.trim() || 'NO_VALUE';
    console.log("Extracted name:", name);
    return name;
  } catch (e) {
    console.error("Error extracting name:", e);
    return 'NO_VALUE';
  }
}

函数优化点:

  • 减少重复正则实例的创建,逻辑更清晰
  • 用可选链?.简化空值判断,避免嵌套条件
  • 明确处理无匹配正则的情况,直接返回默认值
  • 统一使用i修饰符(不需要g,我们只需要第一个匹配结果)

3. 测试调用

用你的示例参数测试,注意字符串形式的正则要转义反斜杠:

const string1 = "OPERATION";
const string2 = "退回自動轉賬 WRITE SOMEOPERATIONS TO MR . MANOJ-THOMAS";
const regexList = ["MR\\.?\\s*(.*?)\\s*$"];

const result = getName(string1, string2, regexList);
console.log(result); // 输出: MANOJ-THOMAS

额外提示

如果你的正则列表需要从JSON解析(你代码注释里提到的regex = JSON.parse(regex)),确保传入的JSON字符串里的反斜杠已经正确转义,比如"MR\\\\.?\\\\s*(.*?)\\\\s*$"。

内容的提问来源于stack exchange,提问作者Ameya Salagre

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:05:19