在下面的示例中,我想在正则表达式中创建两个组:
姓名FirtSurname SecondSurname ..
第一组是姓名
第二个Fort姓氏第二姓氏......
^(\w+)(.*)$ - would capture all
\w+ - would make n groups (number of words).
我只想要两组。名字和随后的任何内容。
有帮助吗?
首先,作为一个用我的名字标点符号的人:-)请不要使用\w
来尝试匹配名字:-) ... -
和'
都不常见。
使用Perl,例如:
if ("Bruce-Robert Fenn Pocock" =~ /^(\w+)(.*)$/) { print "First: $1 Rest: $2" }
→ First: Bruce Rest: -Robert Fenn Pocock
也许只是将所有非空格字符分组,然后跳过第一次出现的空格:
if ("Bruce-Robert Fenn Pocock" =~ /^(\S+)\s*(.*)$/) { print "First: $1 Rest: $2" }
→ First: Bruce-Robert Rest: Fenn Pocock
当然,如果您在数据集中遇到具有中间名称的人,则无法将它们与matronym-patronym对或多部分姓氏区分开来。
我希望/假设你的投入也没有尊敬。
First: Don Rest: Juan de la Mancha
*** wrong: Don is honorific
First: Diego Rest: de la Vega
First: John Rest: Jacob Smith
*** wrong: Jacob is probably a middle name
First: De'shawna Rest: Cummings
First: Wehrner Rest: von Braun
First: Oscar Rest: Vazquez-Oliverez
最终,要将名称准确地分解为敬意,名字,中间名,姓(姓名,副词)和后缀(es)的唯一方法是提问。
(EG。我自己的名字,在Anglo圈子里,“Fenn”被认为是拉丁美洲圈子中的“中间名”,它被解释为一个matronym。)
通常可以从列表中猜到荣誉和足够,但是例如军事头衔和博士学位是一长串(“John Doe博士,Pharm.D”,“Maj.Gen。Thomas Ts'o”)而且并不明确(例如“Don”既是“唐纳德”的缩写,也是敬语)。
http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
假设您只想要组1中的名字和组2中名称的其余部分:
^(\b[\w]+\b)([\w\W]+)
假设单词之间只有一个空格,这有效:
(\w+) ([\w ]+)
如果有多个空格可能:
(\w+) +([\w ]+)
消除末端的空间:
\b(\w+)\b \b([\w ]+)\b
允许破折号和撇号,如@BRPocock所述:
\b([\w-']+)\b \b([\w -']+)\b
虽然这禁止在末尾标点符号,但它允许多个破折号和撇号,包括彼此相邻,例如:Mc'er'''doo--dl-e
使其更加强大可以成为一个项目本身。