如何编写仅在匹配三个必需的捕获组时才匹配的正则表达式

How do I write a regular expression that only matches if match three required capture groups

我想匹配包含以下内容的字符串:

  1. 首字母缩写
  2. 中间名
  3. 姓氏 + 可选后缀(Jr. Sr. III 等)

不匹配由名字 + 姓氏和后缀组成的字符串。

我有以下示例数据:

H. Graham Motion
T. James Kelly
J. Palacios Moli
A. Chadwick Box
H. Graham Motion III
T. James Kelly, Jr.
H. Graham Motion II
V. Barboza Jr.

我想匹配除最后一个以外的所有字符串。

这是我的正则表达式:

^(\w\.)(\s\w+\s[\sI\,\sJSr.]{0,5})*(\w+[\sI\,\sJSr.]{0,5})$

但它不起作用。可以在regex101.

看到正则表达式here

我稍微调整了你的表达方式,得出 ^(\w\.)\s(\w+)\s(\w+(?:,?\s(?:I{0,5}|Jr\.|Sr\.))?)$。为了理智和清晰起见,我将 \s 移出捕获组,因为我假设您没有将中间名定义为具有前导和尾随 space 的单词字符字符串。我觉得我本着你定义的姓+后缀的精神

(非常冗长)解释:

^                             start
(                             1st group (1st initial)
  \w\.                        one word char followed by a period
)
\s                            one whitespace char
(                             2nd group (middle name)
  \w+                         1 or more word chars
)
\s                            one whitespace char
(                             3rd group (last name + optional suffix)
  \w+                         1 or more word chars
  (?:                         non-capturing group (optional suffix)
    ,?                        0 or 1 commas
    \s                        one whitespace char
    (?:I{1,5}|Jr\.|Sr\.)      one of: 1-5 I chars, "Jr." or "Sr."
  )?                          match suffix group 0 or 1 times
)
$                             end

您会注意到我将 I{0,5} 更改为 I{1,5},因为 0 个字符对我来说似乎不是什么后缀。但是,我没有看到很多人使用后缀 IIIIIIIII,因此您可能希望将其更改为 I{0,3}|IV|V。您可能还想将姓氏后面的可选逗号更改为 require 它在 Jr./Sr 之前。 不允许它在罗马数字前。

此外,请记住 \w 也匹配下划线和数字! \s 匹配大多数白色 space 字符,而不仅仅是常规的 space.