我有这个正则表达式:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/;
这是一个表单验证中的姓名字段。
我想使输入类似于“Anna-nicole”(注意连字符)的名字成为可能,但目前连字符会导致错误。
我需要重新制作这个正则表达式,以便可以在姓名中包含连字符;最好我应该使它不能以连字符开头或结尾。只有在“单词或姓名”之间的连字符应该被允许。
有人知道怎么做吗?
顺便说一句,这是JavaScript。
我有这个正则表达式:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/;
这是一个表单验证中的姓名字段。
我想使输入类似于“Anna-nicole”(注意连字符)的名字成为可能,但目前连字符会导致错误。
我需要重新制作这个正则表达式,以便可以在姓名中包含连字符;最好我应该使它不能以连字符开头或结尾。只有在“单词或姓名”之间的连字符应该被允许。
有人知道怎么做吗?
顺便说一句,这是JavaScript。
你需要使用反斜杠转义减号。
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/;
为了防止他们在开头或结尾使用它,可以尝试这样做:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s]+$/;
在许多正则表达式方言中,字符类中的普通连字符/减号需要位于开头或结尾:
/^[-a-zA-ZåäöÅÄÖ\s]+$/
/^[a-zA-ZåäöÅÄÖ\s-]+$/
否定字符类:
/^[^-a-zA-ZåäöÅÄÖ\s]+$/
/^[^a-zA-ZåäöÅÄÖ\s-]+$/
如果右括号也要被包含在内,那么请将方括号放在前面并在末尾加上连字符:
/^[]a-zA-ZåäöÅÄÖ\s-]+$/
如果您需要排除闭合方括号和连字符,那么:
/^[^]a-zA-ZåäöÅÄÖ\s-]+$/
对于这个问题,一个可能的解释是:您希望在连字符周围坚持字母字符,并且仅允许在开头和结尾处有空格,并且您可能希望在允许连字符的地方允许撇号,并且您想避免连续使用连字符或撇号。
/^\s*[a-zA-ZåäöÅÄÖ]*([a-zA-ZåäöÅÄÖ]+[-'][a-zA-ZåäöÅÄÖ]+)*\s*$/
警告:该正则表达式是在Perl中进行测试的,不是JavaScript。
字符串起始处,零个或多个空格;零个或多个字母字符;一到多个“一个或多个字母字符加上连字符或撇号和一个或多个字母字符”的序列,后跟字符串结束。您可以在第一个\s*
之后和第二个\s*
之前增加额外的括号来捕获整个名称。
对于Anna-nicole
,第一个字母术语将匹配Ann
,而另一个字母术语将匹配a-nicole
。对于Anonymous
,第一个术语将匹配整个字符串,第二个术语将为空。对于O'Reilly
,第一个术语将为空,第二个术语将匹配整个字符串。像“C--d”和“Who''Me”这样的名称将被拒绝(不允许重复的连字符或撇号)。它将允许 Smith-Jones-and-Son
和 Smith-And-O'Reilly
作为一个名字。它不会允许前导或尾随的连字符或撇号。
如果您想允许'first-name last-name',您需要在两个上述的“核心”之间使用\s+
。等。
[
'后的第一个字符是'^
'。最后一个甚至更加深奥。但是,它们都没有处理确保破折号仅出现在单词之间而不与空格相关等更复杂问题。我有点想删除答案 - 但是关于在正则表达式中放置字符类中的破折号的信息仍然有用(我希望),即使它没有解决更大(和更)复杂的问题。 - Jonathan Leffler/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/
应该这样做(存在一个令人讨厌的边缘情况,即单个字符名称,这将无法匹配。是否允许使用单个字符名称?)
这可能取决于实现方式。
在JavaScript中,反斜杠将转义字符类中的减号,但在例如Oracle中,只有将减号放在字符类的开头或结尾才能起到作用。
Nancy - O'Hara
"(在破折号周围加上空格),那么姓氏中的撇号呢? - Jonathan Leffler