我在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编码了?
谢谢!
答案 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]
。
希望有所帮助!