我有这个正则表达式:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/;
这是表单验证中的名称字段。
我需要输入像“Anna-nicole”这样的名字(注意减号)。 目前,减号会导致错误。
我需要重新制作这个正则表达式,以便在名称中包含减号;最好我应该这样做,以便名称不能以减号开头,或以一个减号结束。只允许在“单词或名称”之间使用减号。
有人知道怎么做吗?
BTW,它是JavaScript。
答案 0 :(得分:45)
你必须使用反斜杠转义减号。
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/;
要阻止他们在开头或结尾使用它,请尝试以下方法:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s]+$/;
答案 1 :(得分:17)
在许多正则表达式方言中,在一个字符类中,一个简单的连字符/减号需要是第一个或最后一个:
/^[-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
。它不允许使用前导或尾随连字符或撇号。
如果你想允许'名字姓氏',你需要两个上面正则表达式的“核心”,中间有\s+
。等
答案 2 :(得分:1)
/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/
应该这样做(有一个令人讨厌的单个字符名称的边缘情况,这是不匹配的。是否允许单个字符名称?)
答案 3 :(得分:0)
这可能取决于实施。在Javascript中,反斜杠将转义字符类中的减号,但在例如Oracle中,只将减号放在字符类中的第一个或最后一个符号就可以了。