应允许以下用户名:
Foo-Bar
Foobar
Fooo_123
Foob123_1
Foo-bar-123
不允许使用以下用户名:
_Foobar_
F-o-o-b-a-r
-Foobar-
_-Foobar-_
这意味着:字符串允许长度为3到20个字符。每三个字符只允许一个短划线或下划线。不是在开始,不是在结束。您最多只能使用2个短划线或下划线,最多3个数字,但最少3个字母。
这是我到目前为止所做的Regexp,但我已经失败了允许前端和后端的破折号:
/^[^\-_][a-zA-Z0-9]{3,20}[^\-_]$/
提前致谢!
答案 0 :(得分: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 :(得分:0)
我建议你从/^(?![-_])[-_a-zA-Z0-9]{3,20}(?<![-_])$/
开始,这将允许你所有的ok用户名和只有一个不好的(详见rubular)。然后继续Doorknob suggested并对频率施加限制 - 并使用_,......
如何 - 和_在开始和结束时被抑制?
(?![-_])
确保下一个字符既不是_也不是_ (?<![-_])
确保前一个字符既不是_也不是_