Java 名字和姓氏的唯一正则表达式
我有一个单一的输入,用户应该输入姓名。问题是我需要使用checking regEx。有一个需求列表:Java 名字和姓氏的唯一正则表达式,java,regex,string,validation,input,Java,Regex,String,Validation,Input,我有一个单一的输入,用户应该输入姓名。问题是我需要使用checking regEx。有一个需求列表: 名称应以大写字母(而不是空格)开头 不可能有空间堆栈 它有义务支持这些名字和姓氏(所有人都可以写自己的名字)。例如: John Smith and Armirat Bair Hossan 最后一个符号不应该是空格 请帮忙 我有类似正则表达式的自动取款机 ^\\p{L}\\[p{L} ,.'-]+$ 但它拒绝所有的输入,这是不好的 谢谢你帮助我 更新: CORRECT INPUT: "J
John Smith
and
Armirat Bair Hossan
^\\p{L}\\[p{L} ,.'-]+$
但它拒绝所有的输入,这是不好的
谢谢你帮助我
更新:
CORRECT INPUT:
"John Smith"
"Alberto del Muerto"
INCORRECT
" John Smith "
" John Smith"
试试这个
^[A-Z][a-z]+(([\s][A-Z])?[a-z]+){1,2}$
但是使用\\代替\for java您可以使用
^[\p{Lu}\p{M}][\p{L}\p{M},.'-]+(?: [\p{L}\p{M},.'-]+)*$
或
参见和
Java声明:
if (str.matches("[\\p{Lu}\\p{M}][\\p{L}\\p{M},.'-]+(?: [\\p{L}\\p{M},.'-]+)*")) { ... }
// or if (str.matches("\\p{Lu}\\p{M}*+(?:\\p{L}\\p{M}*+|[,.'-])++(?: (?:\\p{L}\\p{M}*+|[,.'-])++)*+")) { ... }
第一个正则表达式细分:
-字符串的开头(不需要使用^
方法)匹配()
-1个Unicode字母(包括预合成的字母,如[\p{Lu}\p{M}]
匹配变音符号和\p{M}
匹配任何大写Unicode基字母)\p{Lu}
-匹配一个或多个Unicode字母,a[\p{L}\p{M},.-]+
,,
,
或'
(如果有一个字母名称有效,请在此处末尾将-
替换为+
)-
-0个或多个(?:[\p{L}\p{M},.-]+)*
-空格
-1个或多个字符,可以是Unicode字母或逗号、句点、撇号或[\p{L}\p{M},.-]+
-
-字符串结尾(不需要使用$
方法)匹配()
['']
)
第二个正则表达式效率较低,但更准确,因为它只匹配基音后的变音符号。有关匹配Unicode字母的详细信息,请参见:
要匹配包含任何变音符号的字母,请使用\p{L}\p{M}*+
你打错了:第二个
\\
应该在p
前面。
但是,即使这样,也缺少一个尾随空格的检查
"^\\p{L}[\\p{L} ,.'-]+$"
对于.matches,以下内容就足够了
"\\p{L}[\\p{L} ,.'-]*[\\p{L}.]"
像“del Rey,Hidalgo”这样的名字不需要大写字母
此外,我建议只需.trim()
输入;想象一个用户因为一个伪空白而拒绝输入。试试这个
^[^- '](?=(?![A-Z]?[A-Z]))(?=(?![a-z]+[A-Z]))(?=(?!.*[A-Z][A-Z]))(?=(?!.*[- '][- ']))[A-Za-z- ']{2,}$
外部网站上也提供了此模式的交互功能。添加您的问题有效和无效输入的示例请分享您的代码。我想你可以试试。别忘了加上两个反斜杠。这可能会有帮助:^\\p{L}\[p{L},.-]+$强制性注意事项:
Alberto del Muerto
不应该是正确的,因为它可以匹配\p{M}
而不检查大写字母。例如:“\u0300abc”
(这是一个分解的\abc
)最详细的答案。@Mariano:我明白,但是有可能在人名的开头出现变音符号吗?我不知道这种情况是否存在。啊!!这是Java,我们可以使用所有格量词:)@Stribizev我不知道,我想是的。但是如果不允许在第一个字母中使用变音符号,那么在第一个字符类中使用\p{M}
就没有意义了,对吗?我添加了第二个选项。这是一样的,但使用所有格量词,不允许在基本字母前出现变音。你能解释一下你的变体吗?我部分无法理解^-字符串[A-Z]的开头-第一个大写字母[A-Z]+-一个或多个小写字母。在([\s][A-Z])之后空格和大写字母以及[a-z]+-一个或多个小写字母。{1,2}-括号中的部分可以是1或2倍(因此名称可以包含2或3个部分)和$-行尾谢谢您的解释
^[^- '](?=(?![A-Z]?[A-Z]))(?=(?![a-z]+[A-Z]))(?=(?!.*[A-Z][A-Z]))(?=(?!.*[- '][- ']))[A-Za-z- ']{2,}$