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
相关产品推荐
相关产品推荐

