更多名称解析异常值

问题描述 投票:0回答:1

名称很难解析为名字、中间名、姓氏、后缀

这组名字(保存在regex.com)让我头疼。

所需的解析实际上是 /^(.)( [Vv][ao]n \s\w+| [Dd][eu]\s \w+)(.)/ 其中分组 ' De La',但我想确保“La name”也包含在内并正确分组,因此我重点关注“De La name”和“La name”之间的区别,以确保逻辑有效。

也不知道如何将 (De La \w+)|(La \w+) 合并到正则表达式的其余部分中。

蒂亚

** 更新(根据 @lemon 的请求)**

名称字符串

Emile La Sére
应返回
(Emile) (La Sére)
,而不会丢失“e”上的变音符号

Justin De Witt Bowersock
应该返回
(Justin) (De Witt) (Bowersock)

Monica De La Cruz
应该返回
(Monica) (De La Cruz)

Robert M. La Follette
应该返回
(Robert M.) (La Follette)
或理想情况下
(Robert) (M.) (La Follette)

Henry St. John
应该返回
(Henry) (St. John)

Edward St. Loe Livermore
应该返回
(Edward) (St. Loe) (Livermore)

Oscar L. Auf der Heide
应该返回
(Oscar) (L.) (Auf der Heide)

我已经能够成功地解析这些不同的分组。我不知道是否可以用单个模式解析整个范围。

部分有效的主要模式是

(^.*)\b([Vv][ao]n\s\w+|[Dd][ue]\s\w+|[Dd]e\s[Ll]a\s\w+|St\.\s\w+)\s*(.*)
,但是,
De Witt
[Dd]e [Ll]a Cruz
和“[Ll]a Follette”之间的交叉让我头疼。

而且我是一个正则表达式新手,所以就是这样。

** 更新 2 ** @第四只鸟的这个图案几乎是完美的。我对它进行了一些添加,以捕获之前未提及的异常值,因此它几乎是无懈可击的。 (假设我没有错过其他模式异常值)

** 更新 **

感谢@第四只鸟这个模式是有效的。

regex regex-group regex-negation pcre2
1个回答
0
投票

正如您已经指出的,名称确实很难解析。请参阅有关程序员对名称的误解的精彩读物。

对于提供的示例数据,您可以使用:

^(.*?)\b((?:[Vv][ao]n|(?:[Dd][eu]\s+)?La|[Dd][eu]|St\.|Auf\s+der)\s+\p{L}+)(.*)
  • ^
    字符串开头
  • (.*?)
    捕获第1组,匹配尽可能少的任意字符
  • \b
    单词边界
  • (
    捕获第 2 组
    • (?:
      替代方案的非捕获组
      • [Vv][ao]n
        匹配
        V
        v
        a
        o
        之一,然后匹配
        n
      • |
        或者
      • (?:[Dd][eu]\s+)?La
        (可选)匹配
        D
        d
        e
        u
        和 1 个以上空白字符,后跟
        La
      • |
        或者
      • [Dd][eu]
        匹配
        D
        d
        e
        u
      • 之一
      • |
        或者
      • St\.
        匹配
        St.
      • |
        或者
      • Auf\s+der
        匹配
        Auf der
        ,中间有 1 个以上空白字符
    • )
      关闭非捕获组
    • \s+
      匹配 1 个以上空白字符
    • \p{L}+
      匹配任意字母 1 次以上
  • )
    关闭第 2 组
  • (.*)
    捕获组 3,可选择捕获任何角色

查看 正则表达式演示

使用包含

\u
标志的 JavaScript 来表示 Unicode 时:

const regex = /^(.*?)\b((?:[Vv][ao]n|(?:[Dd][eu]\s+)?La|[Dd][eu]|St\.|Auf\s+der)\s+\p{L}+)(.*)/gmu;

请注意,

\s
也可以匹配换行符。

例如,当使用 pcre 时,您可以将

\s
替换为
\h
以匹配水平空白字符(无换行符)

© www.soinside.com 2019 - 2024. All rights reserved.