包含点 (.) 的名字和姓氏的正则表达式

REGEX for first and last names involving dots (.)

我希望能够始终以大写字母开头的名字和姓氏...我已经在 Whosebug 上的 post 中实现了这一点,就是这个:

[A-Z][a-z]+([ ][A-Z][a-z]+)*

但是,根据我的业务规则,我需要能够仅通过名字和姓氏的首字母后跟句点和 space 或仅通过句点来验证姓名和姓氏如果句号在字符串的末尾。

例如:

"John Doe" -> true
"John D." -> true
"John D. D." -> true
"John D. D. " -> false (as here we have a space after the last dot in S.)
"John D.  D." -> false (as here two spaces after the first . in B.)
"John D.oe" -> false (as here we have a point not being followed by a space)

为了解决这种情况,我编写了以下代码,它只是表示一个点 (.) 后跟一个 space ( ),但是我没有不知道还能做什么,我不知道如何在上面指定的 REGEX 中引入这段代码...

([.][\s]?)

我想出的正则表达式不完整,没有产生我想要的结果:

^[A-Z](?:[a-z]|[\.])+(?:[ ][A-Z](?:[a-z]|[\.])+)*$

John D.oe -> 匹配 true,但它不应该因为每个点后应该有一个 space...

有人知道我该如何解决这个问题吗?

您可以尝试匹配正则表达式

^[A-Z][a-z]+ [A-Z](?:[a-z]+|\.(?: [A-Z]\.)?)$

Demo

表达式可以分解如下

^              # match beginning of string
[A-Z]          # match an uppercase letter
[a-z]+         # match one or more lowercase letters
[ ][A-Z]       # match a space followed by an uppercase letter
(?:            # begin a non-capture group
  [a-z]+       # match one or more lowercase letters
|              # or
  \.           # match a period
  (?:          # begin a non-capture group
    [ ][A-Z]\. # match a space followed by an uppercase letter
               # followed by a period   
  )?           # end inner non-capture group and make it optional
)              # end outer non-capture group
$              # match the end of the string

我在上面的字符 类 ([ ]) 中包含了空格,只是为了让它们可见。

(?:[a-z]|[\.])+等同于[a-z.]+(这里不需要转义点)

你要[A-Z](?:[a-z]+|\.)(不确定+是否应该是*,名字可以只有一个字母(没有缩写))。

结果将是:

^[A-Z](?:\.|[a-z]*)(?: [A-Z](?:\.|[a-z]*))+$

Demo

"John Doe"      // true
"John D."       // true
"John D. D."    // true
"John D. D. "
"John D.  D."
"John D.oe"
"J. Doe"        // true
"J. D."         // true
"John DDoe"