包含点 (.) 的名字和姓氏的正则表达式
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]\.)?)$
表达式可以分解如下
^ # 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]*))+$
"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"
我希望能够始终以大写字母开头的名字和姓氏...我已经在 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]\.)?)$
表达式可以分解如下
^ # 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]*))+$
"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"