我有一个输入,用户应输入姓名和姓氏。问题是我需要使用检查regEx。有一个要求清单:
它必须支持这些姓名和姓氏(所有人都可以先写下他们的名字/姓名)。例如:
John Smith
and
Armirat Bair Hossan
最后一个符号不应该是空格。
请帮忙,
ATM我有正则表达式
^\\p{L}\\[p{L} ,.'-]+$
但它拒绝所有输入,这是不好的
感谢您的帮助
更新:
CORRECT INPUT:
"John Smith"
"Alberto del Muerto"
INCORRECT
" John Smith "
" John Smith"
答案 0 :(得分:2)
您可以使用
^[\p{Lu}\p{M}][\p{L}\p{M},.'-]+(?: [\p{L}\p{M},.'-]+)*$
或
^\p{Lu}\p{M}*+(?:\p{L}\p{M}*+|[,.'-])++(?: (?:\p{L}\p{M}*+|[,.'-])++)*+$
请参阅regex demo和demo 2
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}*+|[,.'-])++)*+")) { ... }
第一个正则表达式分解:
^
- 字符串的开头(matches()
方法不需要)[\p{Lu}\p{M}]
- 1个Unicode字母(包括预先组合的\p{M}
符合变音符号,\p{Lu}
匹配任何大写 Unicode基本字母)[\p{L}\p{M},.'-]+
- 匹配1个或多个Unicode字母,,
,.
,'
或-
(如果1个字母名称有效,则替换{ {1}} +
在此末尾)-
- 0或更多序列
(?: [\p{L}\p{M},.'-]+)*
- 空格
- 一个或多个Unicode字母或逗号,句号或撇号或[\p{L}\p{M},.'-]+
的字符。-
- 字符串结尾($
方法不需要)注意:有时,名称包含撇号,您可以将它们添加到字符类(matches()
)。
第二个正则表达式效率较低但更准确,因为它只能匹配基本字母后的变音符号。查看有关在regular-expressions.info匹配Unicode字母的详细信息:
要匹配包含任何变音符号的字母,请使用
[‘’]
。
答案 1 :(得分:2)
试试这个
^[^- '](?=(?![A-Z]?[A-Z]))(?=(?![a-z]+[A-Z]))(?=(?!.*[A-Z][A-Z]))(?=(?!.*[- '][- ']))[A-Za-z- ']{2,}$
外部网站上还提供了此模式的交互式 Demo。
答案 2 :(得分:1)
你犯了一个错字:第二个\\
应该在p
前面。
然而,即使这样,尾随空格也会缺少检查
"^\\p{L}[\\p{L} ,.'-]+$"
对于.matches,以下就足够了
"\\p{L}[\\p{L} ,.'-]*[\\p{L}.]"
像“del Rey,Hidalgo”这样的名字不需要初始资本。
我还建议简单地.trim()
输入;想象用户关于输入被拒绝的虚假空白。
答案 3 :(得分:0)
试试这个
^[A-Z][a-z]+(([\s][A-Z])?[a-z]+){1,2}$
但是使用\\代替\来代替java