【问题标题】:Iterate through string遍历字符串
【发布时间】:2018-05-15 18:33:35
【问题描述】:

我在分配 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 编码? 谢谢!

【问题讨论】:

  • 使用的语言在您问题的标签中。尝试保留标题以进行解释,而不是标记。这里的代码也有点残骸,我不确定你的缩进发生了什么。请记住,Ruby 不会将{ ... } 用于ifelse 之类的东西。
  • 提供的代码首先不会通过 ruby​​ 解析器。请发布您运行的真实代码以解决gsub 的问题不会修改值(也存在。)NB我在一定程度上修复了缩进。
  • 如果 HID_num 包含多个匹配项怎么办?

标签: arrays ruby string loops element


【解决方案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;否则,返回字符串的数字部分,转换为整数值。

希望有帮助!

【讨论】:

  • 哇哦!老师根本没有解释正则表达式,但是教科书里有。非常感谢!!!
【解决方案2】:

你可以使用:

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

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

希望有帮助!

【讨论】:

  • 我认为scan 会更干净。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2015-08-26
相关资源
最近更新 更多