将连字符包含在这个正则表达式中,如何实现?

41

我有这个正则表达式:

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

这是一个表单验证中的姓名字段。

我想使输入类似于“Anna-nicole”(注意连字符)的名字成为可能,但目前连字符会导致错误。

我需要重新制作这个正则表达式,以便可以在姓名中包含连字符;最好我应该使它不能以连字符开头或结尾。只有在“单词或姓名”之间的连字符应该被允许。

有人知道怎么做吗?

顺便说一句,这是JavaScript。


您目前允许两端空格 - 您是否也想将它们限制?您是否想禁止 "Nancy - O'Hara"(在破折号周围加上空格),那么姓氏中的撇号呢? - Jonathan Leffler
@Jonathan:是的,既然你提到了,我也想要那个。 - user188962
4个回答

55

你需要使用反斜杠转义减号。

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

为了防止他们在开头或结尾使用它,可以尝试这样做:

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

这会阻止他们在字段开头或结尾使用减号吗? - user188962
使用正则表达式将"+"符号替换为{1},以防止仅第一个和最后一个字符为"-"或将第一个"+"替换为{5}如果它应该在5个字符后允许。 - Martin Clemens Bloch
2
值得注意的是,a) 减号应该放在开头或结尾,b) 在许多正则表达式实现中不需要对其进行转义。 - redreinard
有没有一种方法可以同时转义它们,以提高可读性? - Ooker

24

在许多正则表达式方言中,字符类中的普通连字符/减号需要位于开头或结尾:

/^[-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-SonSmith-And-O'Reilly 作为一个名字。它不会允许前导或尾随的连字符或撇号。

如果您想允许'first-name last-name',您需要在两个上述的“核心”之间使用\s+。等。


谢谢Jonathan,但我应该把它们都合并吗?我不太知道它们的含义,只告诉我应该选择哪一个吧 :) - user188962
1
@Camran:选择你需要的那个 - 可能是前两个之一。后两个处理否定字符类,其中'['后的第一个字符是'^'。最后一个甚至更加深奥。但是,它们都没有处理确保破折号仅出现在单词之间而不与空格相关等更复杂问题。我有点想删除答案 - 但是关于在正则表达式中放置字符类中的破折号的信息仍然有用(我希望),即使它没有解决更大(和更)复杂的问题。 - Jonathan Leffler

1
/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/ 

应该这样做(存在一个令人讨厌的边缘情况,即单个字符名称,这将无法匹配。是否允许使用单个字符名称?)


0

这可能取决于实现方式。

在JavaScript中,反斜杠将转义字符类中的减号,但在例如Oracle中,只有将减号放在字符类的开头或结尾才能起到作用。


2
能否给提问者一个例子,说明你的意思?比如修复他们的代码? - Geoffrey Booth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接