修改正则表达式以验证密码是否至少包含一个大写字母。红宝石

时间:2014-11-19 14:10:24

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

我有这个经常性的表达

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

我想修改它以验证密码至少有一个大写字母

我试过在A-Z +之后放一个+号,但是没有用

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

请帮帮我吗?

2 个答案:

答案 0 :(得分:0)

您可以使用:

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

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

答案 1 :(得分:0)

很抱歉,但我对正则表达式的预测非常糟糕,但我想提供另一种解决方案,这是单线

# 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