如何编写仅在匹配三个必需的捕获组时才匹配的正则表达式
How do I write a regular expression that only matches if match three required capture groups
我想匹配包含以下内容的字符串:
- 首字母缩写
- 中间名
- 姓氏 + 可选后缀(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 个字符对我来说似乎不是什么后缀。但是,我没有看到很多人使用后缀 IIII
或 IIIII
,因此您可能希望将其更改为 I{0,3}|IV|V
。您可能还想将姓氏后面的可选逗号更改为 require 它在 Jr./Sr 之前。 不允许它在罗马数字前。
此外,请记住 \w
也匹配下划线和数字! \s
匹配大多数白色 space 字符,而不仅仅是常规的 space.
我想匹配包含以下内容的字符串:
- 首字母缩写
- 中间名
- 姓氏 + 可选后缀(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 个字符对我来说似乎不是什么后缀。但是,我没有看到很多人使用后缀 IIII
或 IIIII
,因此您可能希望将其更改为 I{0,3}|IV|V
。您可能还想将姓氏后面的可选逗号更改为 require 它在 Jr./Sr 之前。 不允许它在罗马数字前。
此外,请记住 \w
也匹配下划线和数字! \s
匹配大多数白色 space 字符,而不仅仅是常规的 space.