【问题标题】:Ruby Regexp Not Working红宝石正则表达式不工作
【发布时间】:2014-02-12 23:04:09
【问题描述】:

应允许以下用户名:

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}[^\-_]$/

提前致谢!

【问题讨论】:

    标签: ruby-on-rails ruby regex


    【解决方案1】:

    这对于单个正则表达式来说可能太复杂了,如果你能做一个,那就太难读和太复杂了。我建议您只需进行多项检查;例如:

    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。尝试制作厨房水槽图案是一种慢慢陷入疯狂的过程。我更喜欢看到几个小的、易于理解的模式,尤其是当我不得不查看别人的代码时。
    • 由于您使用否定字符类[^-_],该模式允许任何特殊字符(#!^$*%...)。为确保只有破折号、下划线、字母和数字,您必须将其更改为 [a-zA-Z0-9][^\W_]。另一件事,为什么不使用valid = str.length.between?(3, 20)(未测试)?
    • @CasimiretHippolyte 它在哪里说不允许使用特殊字符?我想我可以使用between?;我会编辑帖子
    • @Doorknob:你说得对,哪里都没有说!通过阅读示例字符串,我假设没有特殊字符!然而,这可能是一个错误的假设。
    • @Just 如果你删除了它,你将无法使用破折号或下划线!
    【解决方案2】:

    我建议您从/^(?![-_])[-_a-zA-Z0-9]{3,20}(?&lt;![-_])$/ 开始,这将允许您的所有正常用户名,并且只允许一个不正常的用户名(有关详细信息,请参阅rubular)。然后继续 Doorknob suggested 并对频率施加限制 - 和 _ 使用,...

    如何抑制开头和结尾的 - 和 _?

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

    【讨论】:

      猜你喜欢
      • 2016-12-14
      • 2019-04-22
      • 2011-10-06
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多