2014-02-12 99 views
1

下列用户应该被允许:Ruby的正则表达式不工作

Foo-Bar 
Foobar 
Fooo_123 
Foob123_1 
Foo-bar-123 

以下用户名不应该被允许:

_Foobar_ 
F-o-o-b-a-r 
-Foobar- 
_-Foobar-_ 

这意味着:该字符串被允许为3至20个字符。每三个字符只允许有一个短划线或下划线。不是在开始而是在结束。您只能使用最多2个短划线或下划线,最多3个数字,但最少3个字母。

这是我的正则表达式到目前为止已经完成,但我已经在前端和末端未能在允许破折号:

/^[^\-_][a-zA-Z0-9]{3,20}[^\-_]$/ 

提前感谢!

回答

3

对于单个正则表达式来说,这可能太复杂了,如果你可以创建一个,它将会过于难以理解和复杂。我建议你只需要多次检查;例如:

valid = str.length >= 3 && str.length <= 20  # or str.length.between? 3, 20 
     && str =~ /^[^-_]+([-_][^-_]{3,})*[-_]?[^-_]+$/ 
     && str.count '-_' <= 2 
     && str.count '0-9' <= 3 
     && str.count 'A-Za-z' >= 3 

正则表达式的说明:

/ 
    [^-_]+  # any amount of non-dashes/underscores (so it can't start with one) 
    (
    [-_]  # a dash/underscore 
    [^-_]{3,} # 3 or more non-dashes/underscores 
) 
    *   # zero or more times 
    [-_]?  # an optional dash/underscore 
    [^-_]+  # any amount of non-dashes/underscores (so it can't end with one) 
/x 
+1

1。试图制作一个厨房水槽模式是一个缓慢下降到疯狂。我更喜欢看到几个小的,易于消化的模式,特别是当我要看别人的代码时。 –

+0

由于您使用否定字符类'[^ -_]',该模式允许使用任何特殊字符('#!^ $ *%...')。为确保只有破折号,下划线,字母和数字,您必须将其更改为“[a-zA-Z0-9]”或“[^ \ W_]”。另一件事,为什么不使用'valid = str.length.between?(3,20)'(未测试)? –

+0

@CasimiretHippolyte它说什么不允许特殊字符?我想我可以用'between?';我会编辑帖子 – Doorknob

0

我建议你开始与/^(?![-_])[-_a-zA-Z0-9]{3,20}(?<![-_])$/,这将让你所有的好,用户名,只有不-OK之一(见rubular了解详情)。然后继续作为Doorknob suggested并对频率施加限制 - 并且_被使用,...

如何 - 和_在开始和结束时被抑制?

  • (?![-_])确保下一个字符既不是 - 也不_
  • (?<![-_])确保前一个字符既不是 - 也不_