在这个正则表达式中加入“减号”,怎么样?

时间:2010-10-24 18:53:34

标签: javascript html regex security validation

我有这个正则表达式:

  var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/;

这是表单验证中的名称字段。

我需要输入像“Anna-nicole”这样的名字(注意减号)。 目前,减号会导致错误。

我需要重新制作这个正则表达式,以便在名称中包含减号;最好我应该这样做,以便名称​​不能以减号开头,或以一个减号结束。只允许在“单词或名称”之间使用减号。

有人知道怎么做吗?

BTW,它是JavaScript。

4 个答案:

答案 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中,只将减号放在字符类中的第一个或最后一个符号就可以了。