在这个正则表达式中包含“减号”,如何?
Posted
技术标签:
【中文标题】在这个正则表达式中包含“减号”,如何?【英文标题】:Include the hyphen into this regular expression, how? 【发布时间】:2011-04-29 22:01:15 【问题描述】:我有这个正则表达式:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+$/;
这是用于表单验证中的名称字段。
我需要让输入像“Anna-nicole”这样的名称成为可能(注意减号)。 目前减号会导致错误。
我需要重新制作这个正则表达式,以便名称中可以包含减号;最好我应该这样做,以便名称也不能以减号开头,或以一结尾。 “单词或名称”之间只允许使用减号。
有人知道怎么做吗?
顺便说一句,它是 javascript。
【问题讨论】:
您目前允许两端有空格 - 您是否也希望它们受到限制?你想禁止'Nancy - O'Hara
'(破折号周围有空格)吗?姓氏中的撇号呢?
@Jonathan:是的,我也想要,既然你提到了。
【参考方案1】:
这可能取决于实现。
在 JavaScript 中,反斜杠将转义字符类中的减号,但例如在 Oracle 中,只有将减号放在字符类中的第一个或最后一个才能达到目的。
【讨论】:
想给 OP 一个例子来说明你的意思吗?比如修复他们的代码?【参考方案2】:在许多正则表达式方言中,在一个字符类中,一个普通的连字符/减号需要放在第一位或最后一位:
/^[-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',你需要两个上面正则表达式的'core',在两者之间有\s+
。等等。
【讨论】:
谢谢乔纳森,但我应该把所有这些结合起来吗?真的不知道它们都是什么意思,请告诉我选择哪一个:) @Camran:选择你需要的——这可能是前两个之一。后两个处理否定字符类,其中“[
”之后的第一个字符是“^
”。最后一个更深奥。但是,他们中的任何一个都没有处理更复杂的问题,即确保破折号仅出现在单词之间,与空格无关等。我很想删除答案 - 但有关放置破折号的位置的信息in 正则表达式中的字符类仍然有用(我希望),即使它没有解决更大(和更多)复杂的问题。【参考方案3】:
您必须使用反斜杠转义减号。
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s\-]+$/;
要阻止他们在开始或结束时使用它,请尝试以下操作:
var alphaExp = /^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s]+$/;
【讨论】:
这会阻止他们在字段的开头或结尾使用减号吗? 将“+”号替换为 1 以防止只有第一个和最后一个字符为“-”或第一个 + 为 5(如果应该在 5 个字符后允许)。 addedbytes.com/cheat-sheets/download/… 可能值得注意的是a)减号应该放在开头或结尾,b)在许多正则表达式实现中不需要转义它 有没有办法一次逃脱所有这些,以提高可读性?【参考方案4】:/^[a-zA-ZåäöÅÄÖ\s]+[a-zA-ZåäöÅÄÖ\s\-]*[a-zA-ZåäöÅÄÖ\s\]+$/
应该这样做(单个字符名称存在令人讨厌的边缘情况,这将不匹配。是否允许使用单个字符名称?)
【讨论】:
以上是关于在这个正则表达式中包含“减号”,如何?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用正则表达式匹配 Ruby 中包含特殊字符的重复模式?
正则表达式(preg_split):如何根据分隔符进行拆分,不包括一对引号中包含的分隔符?