在下面的示例中,我想在正则表达式中创建 2 个组:
名字 FirtSurname SecondSurname ..
第一组是名称
第二个 FirtSurname SecondSurname ...
^(\w+)(.*)$ - would capture all
\w+ - would make n groups (number of words).
我只想要2组。名字和后面的任何东西。
有什么帮助吗?
在下面的示例中,我想在正则表达式中创建 2 个组:
名字 FirtSurname SecondSurname ..
第一组是名称
第二个 FirtSurname SecondSurname ...
^(\w+)(.*)$ - would capture all
\w+ - would make n groups (number of words).
我只想要2组。名字和后面的任何东西。
有什么帮助吗?
首先,作为我名字中带有标点符号的人:-) 请不要\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
当然,如果您在数据集中遇到具有中间名的人,则无法将他们与母母-父母对或多部分姓氏区分开来。
我希望/假设您的输入也没有敬语。
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
归根结底,将一个名字准确地分解为敬语、名字、中间名、姓氏(母名、父名)和后缀的唯一方法是询问。
(例如,我自己的名字,在盎格鲁圈子里,“芬恩”被认为是一个“中间名”,在拉丁裔圈子里,它被解释为母语。)
敬语和称谓通常可以从一个列表中猜到,但例如军事头衔和博士称谓是一个很长的列表(“Dr John Doe, Pharm.D”、“Maj. Gen. Thomas Ts'o”),并且不是明确的(例如,“Don”既是“Donald”的缩写形式,也是敬语)。
http://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/
假设单词之间只有一个空格,这可行:
(\w+) ([\w ]+)
如果可能有多个空格:
(\w+) +([\w ]+)
要消除末端的空格:
\b(\w+)\b \b([\w ]+)\b
如@BRPocock 所述,允许使用破折号和撇号:
\b([\w-']+)\b \b([\w -']+)\b
虽然这禁止在末尾使用标点符号,但它允许多个破折号和撇号,包括彼此相邻,例如:Mc'er'''doo--dl-e
使它比这更强大可以成为一个项目本身。
假设您只想要第 1 组中的名字和第 2 组中的其余名称:
^(\b[\w]+\b)([\w\W]+)