通过字符串迭代

时间:2017-12-01 15:56:56

标签: arrays ruby string loops element

我在Ruby中遇到了一个很难的任务(我们刚刚开始看到它)。我认为我接近答案,但是我对如何使用字符串元素有些不对。

因此,赋值是使用一个带有字符串的方法HID_Num(String)

要成为一个有效的字符串,它需要有:4个大写字母,后跟8位数字(例如:"ABCD18347692")。该方法应该将单个数字作为整数值返回,如果没有个体有效则返回nil卡号被找到。

例如:HID_num"ADBC12345678 abcD12345678")应该返回12345678 我的代码到目前为止:

def HID_num(str)
  str.gsub(/\s+/m, ' ').strip.split(" ")
  str.each { |element|
    if(element.count == 12)
      count = str.count("A-Z")
      if(count == 4)
        count2 = str.count("1-9")
        if(count == 8)
          puts str[3...11]
        else{
            puts "nil"
        }   }
    end end

它有什么问题:不存储str.gsub的元素。 我正在考虑使用指针,但不知道如何使用它们或者将每个元素存储在一个数组中,但我不知道如何......也许我的想法太像Java编码了? 谢谢!

2 个答案:

答案 0 :(得分:1)

使用正则表达式非常容易。这是一个例子:

def hid_num(str)
  exp   = /\A[a-z]{4}(\d{8})\z/i
  match = str.match(exp)
  match && match[1]&.to_i
end

在这种情况下,表达式exp匹配以4个字母字符开头的字符串,后跟8个数字,到字符串的末尾。接下来,我们针对提供的exp抓取str的匹配项。如果没有匹配,则返回nil;否则,返回字符串的数字部分,强制转换为整数值。

希望有所帮助!

答案 1 :(得分:0)

您可以使用:

def HID_num(string)
  entries = string.split(" ")
  entries.map do |entry|
    matches = entry.match(/\A[A-Z]{4}(\d{8})\z/)
    next unless matches
    matches[1]
  end.compact
end

它是一个相当简单的正则表达式匹配器 - 这将返回所有有效字符串的数组'数字。如果您想调整它以仅返回第一个有效数字,则可以更改map的{​​{1}}并在each之前添加break },最后删除matches[1]

希望有所帮助!