在Java中创建与人名匹配的正则表达式
我已尝试使用以下方法解析名称:在Java中创建与人名匹配的正则表达式,java,regex,Java,Regex,我已尝试使用以下方法解析名称: static final String NAME_REGEX=“[A-Z][A-Z]+([A-Z][A-Z]+)?” static final String NAME_REGEX=“([A-Z][A-Z]+\\s?+)”;([A-Z]\.?\s?*([A-Z][A-Z]+\\s?+) 我尝试过使用更长、更详细的表达式,我想为这种情况创建一个小的最优正则表达式 我有一个要使用Java正则表达式匹配的名称列表: B. Jack B.Jack Black B Jack
static final String NAME_REGEX=“[A-Z][A-Z]+([A-Z][A-Z]+)?”代码>
static final String NAME_REGEX=“([A-Z][A-Z]+\\s?+)”;([A-Z]\.?\s?*([A-Z][A-Z]+\\s?+)代码>
B. Jack
B.Jack Black
B Jack Black
B J Black
BJ Black
B.Jack Black
B.J.Black
B. Jack Black
Jack B
Jack B.
Black Jack B.
Jack B
Black J.B
Black JB
Black J B
Jack Black
Black Jack Black
Black J Black
Black J. Black
Black J.Black
Albus P W B Dumbledore
Albus P.W.B. Dumbledore
此表达式(([A-Z]\.?\s?*)([A-Z][A-Z]+\.?\s?)+([A-Z]\.?\s?[A-Z]*))*)
。请在接受这些表达式之前检查网站上的所有表达式
不幸的是,此正则表达式也匹配:
BlackJack
Ms Cf Gk
M Gh M
Mh G M
M G Mh
还有其他类似的组合
我找到了一个解决方案,它使用一个正则表达式来匹配上面指定的所有测试用例。我将一步一步地介绍:
此正则表达式([A-Z][A-Z]+\s?++
匹配一组单词,其中每个单词都以大写字符开头,因此这将考虑:
Jack
Jack Black
Black Jack Black
现在,您需要能够匹配一组大写字符,后跟一个
和/或一个空格。在正则表达式语法中,
具有特殊含义,它匹配任何单个字符,因此+
将匹配任何字符串
因此,
必须转换为\。
并且空格被写为\s
,正如您现在可能已经知道的。[A-Z]
指的是一组大写字符,而[A-Z]
显然指的是一组小写字符
因此,这个正则表达式([A-Z].?\s?*)([A-Z][A-Z]+\s?+)
也将匹配:
B. Jack
B.Jack Black
B Jack Black
B J Black
BJ Black
B.Jack Black
B.J.Black
B. Jack Black
Jack B
Jack B.
Black Jack B.
Jack B
Black J.B
Black JB
Black J B
现在,除了
之外,您还可以看到其他字符,如?
表示匹配一个或无,*
表示匹配零个或多个,+
表示匹配一个或多个,以及表达式()
表示一个组。您可以在代码中匹配各个组,但如果找不到该组的匹配项,则值可能为空
现在,对于末尾的首字母([A-Z][A-Z]+\.?\s?+([A-Z]\.?\s?*)
将匹配第一个正则表达式匹配的所有内容,并且也将匹配:
B. Jack
B.Jack Black
B Jack Black
B J Black
BJ Black
B.Jack Black
B.J.Black
B. Jack Black
Jack B
Jack B.
Black Jack B.
Jack B
Black J.B
Black JB
Black J B
到现在为止,您一定已经计算出[A-Z]\.?\s?
将匹配A.
和A
。因此([A-Z]\.?\s?*)
将不再发生这些情况
使用表示或的
组合正则表达式2和正则表达式3将匹配到目前为止我们匹配的所有输入,但它太长。相反,您可以将匹配首字母的正则表达式添加到正则表达式的开始和结束处。这样的表达式将是([A-Z]\.?\s?*([A-Z][A-Z]+\.?\s?)+([A-Z]\.?\s?*)
。此表达式将匹配我们以前匹配的所有内容
但是关于Black J Black
和Black J.Black
呢。我们目前有能力匹配任何看起来像Black J B
的字符串,您只需将[a-z]*
添加到名称末尾表示首字母的组中,使其看起来像(a-z\?\s?[a-z]*)
此表达式类似于([A-Z]\.?\s?*([A-Z][A-Z]+\.?\s?+([A-Z]\.?\s?[A-Z]*))*)
我还注意到,有时应用程序和其他一些地方的名称完全使用大写字符编写,而表达式
([A-Z]\.?\s?)+
会有用。对于那些不知道的人来说。回答自己的问题完全可以。我在一个笔记应用程序中写下了这句话,当我解决这个问题时,我可以删除其他一些较小的表达和解释,如果我认为你需要将一个问题作为一个标准,所以这个问题包括尝试解决的问题(+代码)。也许这就是为什么你得到了几张反对票:(