javascript 细化此名称解析模式

tcomlyy6  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(109)

这种模式

/^(.*?)\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正确解析为LionelVan Deerlin
但是Van Taylor不会解析为VanTaylor
可以调整此模式以正确解析Van Taylor沿着Van的其他示例吗?
我仍然在研究这个模式是如何工作的,以及如何理解这个特殊的正则表达式的魔力。
Tia

更新

尽管这可能是一件愚蠢的差事,但我正在做一个解析的最好的可能版本。
根据评论,Van H. Manning是不同的,因为Van是名,而Van Deerlin是姓。
Van H. Manning类似,Van TaylorVan作为名字和Taylor作为姓氏组成。
我可以看到部分逻辑是字符串开头的Van区分了姓和姓,但是,模式已经正确地对Van \w+进行了分组,所以似乎需要进行一个小的调整。
至于Van H. Manning被解析为Van H.Manning,我使用条件来处理。我不知道如何用其他的东西来正则化那个,我已经在这里要求了很多繁重的工作。

j8ag8udp

j8ag8udp1#

我认为处理所有案件都会变得相当复杂,因为正如每个人所指出的那样,你可能会在姓的前面或后面得到名字(姓或姓)。在某些国家,我甚至认为你的姓可以来自你父母的名,所以想象一下,尝试和检测顺序会有多复杂。
但是,如果你想坚持使用正则表达式,你可以假设Van在字符串的开头,那么它就是名字。在这种情况下,只需向正则表达式添加两个备选项,并将这些部分分成几组。与索引组相比,我命名它们是为了更容易访问。然后,您将不得不放置一些逻辑来查看哪个组是满的或空的。
我还使用了i标志来区分大小写-insensitive,而不是使用[Dd]来处理它。
我个人认为,有几个正则表达式或试图找到一个库来处理它可能是一个更好的主意,特别是如果你也知道这个人的起源,这可能有助于使用地球上的地区的特定规则。

  • PCRE* 正则表达式:
/^
(?: # Where "Van" would be the first name:
  (?<firstname_van>Van)\s(?<lastname_van>.*)
|
  # Other cases: the first name is probably first, but not sure.
  (?<firstname>.*?)\s*
  (?<lastname>
    \b
    (?:
      (?<!^)V[ao]n
      |(?:D[eu]\s+)?La
      |D[eu]
      |St\.
      |Le
      |Auf\s+der
    )
    \s+\p{L}+\.?
  )
  \h*
  (?:
    (?<senority>(?:[JS]r\.?|[IVX]+))
    |
    (?<more>.*)
  )
)
$/gumix

要增强的 JavaScript 版本:

const regexp = /^(?:(?<firstname_van>Van)\s(?<lastname_van>.*)|(?<firstname>.*?)\s*(?<lastname>\b(?:(?<!^)V[ao]n|(?:D[eu]\s+)?La|D[eu]|St\.|Le|Auf\s+der)\s+\p{L}+\.?)[ \t]*(?:(?<senority>(?:[JS]r\.?|[IVX]+))|(?<more>.*)))$/gumi;

const input = `Van H. Manning 
Lionel Van Deerlin
Van Taylor
Emile La Sére
George A. La Dow
Gilbert De La Matyr
Robert M. La Follette
William Leroy La Follette
Robert M. La Follette Sr.
Robert M. La Follette Jr.
Charles M. La Follette
Monica De La Cruz
David A. De Armond
Justin De Witt Bowersock
De Witt C. Giddings
Julien de Lallande Poydras
Henry St. John
Edward St. Loe Livermore
Oscar L. Auf der Heide
Kika de la Garza
Francis Celeste Le Blond
Robert Le Roy Livingston`;

let i = 1;
while ((match = regexp.exec(input)) !== null) {
  console.log(`Match ${i++}`, match.groups);
}

相关问题