ruby upcase将数字视为字符

时间:2016-06-20 19:37:27

标签: ruby

我正在编写密码验证器,我有2个要求:

  1. 存在大写字母
  2. 存在特殊字符(#,$,%等等)
  3. 当我检查大写字母时,我会执行以下操作:

    if letter == letter.upcase
    # 'a' == 'A' false
    # 'A' == 'A' true
    

    问题是某些特殊字符被检测为大写数字,例如:

    '#' == 3.upcase # returns true
    

    所以它放弃了我的得分。如何区分实际的大写字母和数字+变换成特殊符号之类的东西?

2 个答案:

答案 0 :(得分:2)

您可以尝试测试您的角色是否是一封信。您可以使用正则表达式:

def is_upcase?(character)
  # If it's a character from a to z
  if character =~ /[a-zA-Z]/
    character == character.upcase
  else
    # Do whatever you want with it
    false
  end
end

可能有一些宝石或库弄乱了你的upcase方法(或者你使用的是旧的或未知的ruby版本)。 '3'.upcase应该返回'3',而不是'#'

答案 1 :(得分:0)

两种方法:

SPECIAL_CHARS = Regexp.escape "#$%"
  #=> "\\#\\$%" 

<强>#1

def both?(str)    
  str.index(/[A-W]/) && str.index(/[#{SPECIAL_CHARS}]/) ? true : false
end

both? "aAb$," #=> true
both? "a$bA," #=> true
both? "a$ba," #=> false
both? "abAB," #=> false

!!!str.index(/[A-W]/) && str.index(/[#{SPECIAL_CHARS}]/))

<强>#2

def both?(str)    
  str =~ /[A-W].*[#{SPECIAL_CHARS}]|[#{SPECIAL_CHARS}].*[A-W]/ ? true : false
end

both? "aAb$," #=> true
both? "a$bA," #=> true
both? "a$ba," #=> false
both? "abAB," #=> false

(或!!str =~ /.../