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

求助:使用现代JavaScript提取姓名首字母适配无"of"场景

解决姓名首字母提取问题

原代码的问题在于正则硬匹配了of后缀,导致不含of的姓名无法匹配,甚至会因为exec返回null而报错。下面提供两种现代JavaScript写法,同时支持带of和不带of的姓名格式:

方法一:正则表达式优化

调整正则让of后缀变为可选,同时增加空值处理避免报错:

const name1 = "Joshua Jones of USA";
const name2 = "William Sanders";
const name3 = "Grey Charles";

function getUserInitials(name) {
  // 匹配首单词首字母,以及of之前的最后一个单词首字母(无of则取最后一个单词)
  const match = /^(.)\w+\s+([A-Z])\w+(?:\s+of\s+.+)?$/i.exec(name);
  // 处理匹配失败的情况,返回空字符串或自定义默认值
  return match ? match.slice(1,3).join('') : '';
}

console.log(getUserInitials(name1)); // JJ
console.log(getUserInitials(name2)); // WS
console.log(getUserInitials(name3)); // GC

正则说明:

  • ^(.)\w+:匹配第一个单词并捕获首字母
  • \s+([A-Z])\w+:匹配姓氏单词并捕获首字母
  • (?:\s+of\s+.+)?:让of后缀部分变为可选的非捕获组
  • i修饰符:忽略大小写(可选,根据需求调整)

方法二:字符串分割法(更直观)

通过分割字符串过滤掉of及之后的内容,再提取首尾单词的首字母:

const name1 = "Joshua Jones of USA";
const name2 = "William Sanders";
const name3 = "Grey Charles";

function getUserInitials(name) {
  const nameSegments = name.split(' ');
  // 找到of的位置,截取之前的部分作为有效姓名
  const ofPosition = nameSegments.indexOf('of');
  const validNameParts = ofPosition !== -1 ? nameSegments.slice(0, ofPosition) : nameSegments;
  
  // 处理姓名长度不足的边界情况
  if (validNameParts.length < 2) return '';
  
  // 提取首单词和最后一个单词的首字母
  return `${validNameParts[0][0]}${validNameParts.at(-1)[0]}`;
}

console.log(getUserInitials(name1)); // JJ
console.log(getUserInitials(name2)); // WS
console.log(getUserInitials(name3)); // GC

说明:

  • 使用split(' ')拆分姓名为单词数组
  • indexOf('of')定位后缀起始位置,截取有效姓名部分
  • at(-1)是现代JS的数组方法,直接取最后一个元素(替代validNameParts[validNameParts.length-1]更简洁)
  • 增加了边界处理,避免姓名只有一个单词时报错

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 08:22:44