名称拆分正则表达式

时间:2012-03-11 23:31:38

标签: regex

我正在尝试将字符串(人名)拆分为组件:前缀(Dr,Mr,Miss等),给定,中间,系列和后缀(Jr,III等等)。< / p>

前缀和后缀可以是已知的选项列表。

像'达芬奇'或'迪卡普里奥'这样的双管家族的边缘情况并没有让我感到太烦恼。 da和di将只是放在中间名中,或者如果给出中间(即发现4个名称与前缀或后缀不匹配),则第二个名称后面的所有内容都将被删除在姓氏中。

我正在考虑自己编写正则表达式...但在我去重新发明轮子之前,我想知道是否有人能够使用我可以使用的东西?

感谢。

1 个答案:

答案 0 :(得分:1)

以下是perl中的提案(我没有找到语言或正则表达式的要求) Perl支持非捕获组,例如“(?:\ w +)”,我认为需要保持低于10个被捕获的群体。 为简单起见,我几乎到处都在使用“\ w +”。因此,名称可以包含“_”和数字。如果您不喜欢,请改为使用“[[:alpha:]] +”。

perl -pe"s/(?:(Dr\.|Mr\.) )?(?:(\w+)(?: (\w+(?: \w+)*))? )?(?:(\w+) (Jr\.|I+))|(?:(Dr\.|Mr\.) )?(?:(\w+)(?: (\w+(?: \w+)*))? )?(\w+)/pre\1\6 give\2\7 middle\3\8 fam\4\9 post\5/"

出于演示目的,代码替换时插入字段名称。 请提取所请求的正则表达式并填写缺失的pres和帖子。

我认为诀窍是有一个很大的选择“|”,它更喜欢与后缀匹配 通过使用两个组来填充字段,一个来自第一个,一个来自第二个替代。每对中只有一个是非空的 我测试了一个包含

组合的测试文本文件
  • 前缀
  • postfix present
  • 赠送礼物
  • 中间存在(假设更多中间工作)
  • 第二次中间礼物

所有测试用例都有一个姓氏。 “超人II”和“麦当娜”都只有一个姓氏,希望可以,超级英雄电影得到一个后缀。 “Dr. Who”有一个前缀和一个姓氏。

即。正如你所允许的那样,我忽略了“迪”。 我认为输出似乎合理。