You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写可捕获多种姓名格式的高效正则表达式?

嘿,我看你在找一个更鲁棒的正则表达式来处理姓名解析,替换掉之前那个脆弱的暴力解法。先梳理下你给出的姓名案例里的常见模式:有普通的名+姓、带中间名/缩写的组合、带逗号分隔的Jr./Sr.后缀,还有直接跟在姓后面的罗马数字后缀。

针对这些情况,我设计了一个灵活度更高的正则,能完美匹配你列出的所有输入,同时还能兼容更多潜在的姓名格式:

^(?<given_names>(?:[A-Z][a-zA-Z]*\.?\s?)+)\s(?<surname>[A-Za-z]+)(?:,\s?(?<suffix>(?:Jr|Sr)\.|[IVX]+))?$

给你拆解下这个正则的各个部分:

  • (?<given_names>(?:[A-Z][a-zA-Z]*\.?\s?)+):这部分专门捕获「名」的部分,不管是全名(比如Aubrie、Brian)、带点的缩写(H.、E.)、不带点的缩写(JR、HW),还是多个中间名/缩写的组合(Brian Joseph、E. M.)都能匹配到。
  • (?<surname>[A-Za-z]+):捕获姓氏部分,适配常见的英文姓氏格式。
  • (?:,\s?(?<suffix>(?:Jr|Sr)\.|[IVX]+))?:这是可选的后缀匹配,既支持逗号+空格分隔的Jr./Sr.(比如, Jr.),也支持直接跟在姓后面的罗马数字后缀(比如III),问号表示这部分可以不存在。

用你的测试案例验证下效果:

每个输入的匹配结果都符合预期:

  • Aubrie Green → given_names: "Aubrie", surname: "Green", 无后缀
  • Brian Joseph Hernandez, Jr. → given_names: "Brian Joseph", surname: "Hernandez", suffix: "Jr."
  • Calvin H. Borel → given_names: "Calvin H.", surname: "Borel", 无后缀
  • Eddid Martin, Sr. → given_names: "Eddid", surname: "Martin", suffix: "Sr."
  • E. M. Murray → given_names: "E. M.", surname: "Murray", 无后缀
  • JR Smith, Jr. → given_names: "JR", surname: "Smith", suffix: "Jr."
  • HW Bond III → given_names: "HW", surname: "Bond", suffix: "III"

这个正则比你之前的暴力解法强在哪里?它不是靠固定的位置去硬匹配,而是基于姓名的结构模式来解析,所以面对新的姓名格式(比如带更多中间名的、不带点的多字母缩写)都能轻松应对,后续如果要加更多后缀类型(比如II、IV),只需要微调后缀部分的规则就行,扩展性好很多。

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

火山引擎 最新活动