【问题标题】:Modify regular expression for verify that password has at least one uppercase letter. Ruby修改正则表达式以验证密码是否至少包含一个大写字母。红宝石
【发布时间】:2014-11-19 14:10:23
【问题描述】:

我有这个正则表达式

/^[A-Za-z0-9_-]{6,30}$/

我想修改它以验证密码是否至少包含一个大写字母

我尝试在 A-Z+ 后面加上一个 + 号,但没有成功

 /^[A-Z+a-z0-9_-]{6,30}$/

你能帮帮我吗?

【问题讨论】:

  • 那个加号只会让你在密码中加一个加号......你需要使用前瞻来完成这样的事情。
  • 我会改成 6 ;-)

标签: ruby regex ruby-on-rails-3 ruby-on-rails-4 ruby-on-rails-3.2


【解决方案1】:

你可以使用:

/^(?=.*?[A-Z])[\w-]{6,30}$/

这里的(?=.*?[A-Z]) 是一个积极的前瞻,可确保您的正则表达式至少有一个大写英文字母。 另请注意,\w[a-zA-Z0-9_] 相同。

【讨论】:

  • 谢谢阿努巴瓦。 - 字符不包含在 \w 中?
  • 没有连字符不被认为是一个单词字符,这就是我在上面将它分开的原因。
  • Anubhava 我如何做到正则表达式至少有 2 个大写字母而不是一个
  • 为此您可以使用:/^(?=(.*?[A-Z]){2})[\w-]{6,30}$/
【解决方案2】:

抱歉,我在正则表达式前瞻方面真的很糟糕,但我想在这里提供另一种解决方案,即 one-liner

# Data:
passwords = %w(
  tlkjadfjklk
  asdfkjlaj3223$%^&*
  kljjkl32jklfa%^
  ABCDLK233223
  Aiou34i^&*
  23fsaAiou34i^&*
  kljasf90843klj3()*Dlkjafa323
  klAjasf90843klj3()*Dlkjafa323
  A
  ABCDEF
  klAjasf90843klj3klAjasf90843klj3klAjasf90843klj3)

# Code:
passwords.each{|pwd| p [/^(.*?[A-Z]+)/, /[A-Z]+(.*?)$/].inject(0){|sum, regex| sum += regex.match(pwd) ? $~[1].size : 0}.between?(6, 30)}

# Results:
false
false
false
true
true
true
true
true
false
true
false

为了清楚起见,请在下面找到单线的扩展版本:

regex_begin = /^(.*?[A-Z]+)/
regex_after = /[A-Z]+(.*?)$/
passwords.each do |pwd|
  len = [regex_begin, regex_after].inject(0) do |sum, regex|
    sum += regex.match(pwd) ? $~[1].size : 0
  end
  p len.between?(6, 30)
end

【讨论】:

    猜你喜欢
    • 2015-07-14
    • 1970-01-01
    • 2021-04-21
    • 2014-07-04
    • 1970-01-01
    • 2021-09-08
    相关资源
    最近更新 更多