如何从全名字符串中提取名字和首个含连接前缀的复合姓氏
提取规则提炼
从你给出的示例可以明确匹配规则:
- 首个空格分隔的片段固定为名字,直接保留
- 需要识别常见的复合姓氏连接前缀(这类前缀常见于葡萄牙语、西班牙语、意大利语姓名,比如
di、e、de、da、do、dos、das等) - 名字之后的片段如果是前缀,就和紧邻的下一个片段共同组成首个完整姓氏;如果不是前缀,直接取该片段作为首个姓氏
- 最终返回「名字 + 首个完整姓氏」的拼接结果
Java 实现代码
import java.util.Arrays; import java.util.HashSet; import java.util.Set; public class NameExtractor { // 预置复合姓氏前缀集合,可根据实际场景扩展 private static final Set<String> SURNAME_PREFIX = new HashSet<>(Arrays.asList( "di", "e", "de", "da", "do", "dos", "das", "del", "della", "van", "von" )); public static String extractFirstFullName(String fullName) { if (fullName == null || fullName.trim().isEmpty()) { return ""; } String[] nameParts = fullName.trim().split("\\s+"); // 只有名字没有姓氏的情况直接返回 if (nameParts.length == 1) { return fullName; } // 第一个元素固定是名字 StringBuilder result = new StringBuilder(nameParts[0]); // 从第二个元素开始判断 int index = 1; if (SURNAME_PREFIX.contains(nameParts[index].toLowerCase())) { // 是前缀的话,拼接前缀和下一个姓氏片段 result.append(" ").append(nameParts[index]); if (index + 1 < nameParts.length) { result.append(" ").append(nameParts[index + 1]); } } else { // 不是前缀直接拼接当前片段作为姓氏 result.append(" ").append(nameParts[index]); } return result.toString(); } public static void main(String[] args) { // 测试示例 System.out.println(extractFirstFullName("Andre Santos Silva")); // 输出 Andre Santos System.out.println(extractFirstFullName("Andre di Santos Silva")); // 输出 Andre di Santos System.out.println(extractFirstFullName("Andre e Santos Silva")); // 输出 Andre e Santos } }
注意事项
- 前缀集合可以根据你实际处理的姓名所属地区、语言场景按需增删
- 代码已经做了大小写兼容,不管前缀是大写
Di还是小写di都能正确识别 - 如果遇到极端场景比如多个连续前缀(极少出现),可以调整遍历逻辑,匹配到连续前缀全部拼接直到遇到第一个非前缀片段即可
内容的提问来源于stack exchange,提问作者Henrique
相关产品推荐
相关产品推荐

