这种模式
/^(.*?)\b((?:[Vv][ao]n|(?:[Dd][eu]\s+)?[Ll]a|[Dd][eu]|St\.|Le|Auf\s+der)\s+\p{L}+\.?)(.*)/gum
解析名称标记。
我在派生pattern(ECMAScript Flavor)的过程中得到了帮助,并做了一些小的调整,但我被测试字符串中的第三个名称标记卡住了。Van H. Manning
正确解析为Van H.
Manning
(只需使用trim()
删除额外空间)Lionel Van Deerlin
正确解析为Lionel
Van Deerlin
但是Van Taylor
不会解析为Van
Taylor
可以调整此模式以正确解析Van Taylor
沿着Van
的其他示例吗?
我仍然在研究这个模式是如何工作的,以及如何理解这个特殊的正则表达式的魔力。
Tia
更新
尽管这可能是一件愚蠢的差事,但我正在做一个解析的最好的可能版本。
根据评论,Van H. Manning
是不同的,因为Van
是名,而Van Deerlin
是姓。
与Van H. Manning
类似,Van Taylor
由Van
作为名字和Taylor
作为姓氏组成。
我可以看到部分逻辑是字符串开头的Van
区分了姓和姓,但是,模式已经正确地对Van \w+
进行了分组,所以似乎需要进行一个小的调整。
至于Van H. Manning
被解析为Van H.
Manning
,我使用条件来处理。我不知道如何用其他的东西来正则化那个,我已经在这里要求了很多繁重的工作。
1条答案
按热度按时间j8ag8udp1#
我认为处理所有案件都会变得相当复杂,因为正如每个人所指出的那样,你可能会在姓的前面或后面得到名字(姓或姓)。在某些国家,我甚至认为你的姓可以来自你父母的名,所以想象一下,尝试和检测顺序会有多复杂。
但是,如果你想坚持使用正则表达式,你可以假设
Van
在字符串的开头,那么它就是名字。在这种情况下,只需向正则表达式添加两个备选项,并将这些部分分成几组。与索引组相比,我命名它们是为了更容易访问。然后,您将不得不放置一些逻辑来查看哪个组是满的或空的。我还使用了
i
标志来区分大小写-insensitive,而不是使用[Dd]
来处理它。我个人认为,有几个正则表达式或试图找到一个库来处理它可能是一个更好的主意,特别是如果你也知道这个人的起源,这可能有助于使用地球上的地区的特定规则。
要增强的 JavaScript 版本: