在Ruby

时间:2015-05-14 18:41:42

标签: ruby

我需要能够从给定的字符串中提取8个数字的序列。序列不是从字符串到字符串位于相同的位置,并且可以包含任何8位数字。

要从中提取的字符串示例:

"123 ABCDEF 12345678 GHIJKLMN"
"12345678 ABCD 1234 EFGHIJKL"
"123 4567 12345678"

在上面的每个字符串中,我只需要12345678

我已尝试匹配正则表达式/\d+/,但如果在12345678之前显示任何数字,则无效。

3 个答案:

答案 0 :(得分:5)

您可以使用以下正则表达式执行此操作:

r = /
    (?<!\d) # negative lookbehind: cannot match a digit
    \d{8} # match 8 digits
    (?!\d) # negative lookahead: cannot match a digit
    /x

 "12345678 ABCD 1234 EFGHIJKL"[r]
   #=> "12345678"
 "x123456789 ABCD 1234 EFGHIJKL"[r]
   #=> nil

答案 1 :(得分:3)

尝试指定您需要八位数字:

/(?<!\d)\d{8}(?!\d)/

编辑:添加负面后视和负前瞻以仅匹配正好8位数的序列。图片来源:@CarySwoveland。

答案 2 :(得分:3)

您可以通过两个步骤完成所需的操作:

def find8_1(string)
  index = string =~ /\d{8}/
  return index && !(string[index+8] =~ /\d/) ? string[index,8] : nil 
end

# Some examples
puts "Results with find8_1"
puts find8_1("123 ABCDEF 12345678 GHIJKLMN") # => "12345678" 
puts find8_1("12345678 ABCD 1234 EFGHIJKL")  # => "12345678" 
puts find8_1("123 4567 12345678")            # => "12345678" 
puts find8_1("123 4567 1234567")             # => nil 
puts find8_1("123456789")                    # => nil


def find8_2(string) 
  arr = string.scan(/\d+/) 
  return arr.find { |s| s.size == 8}
end

# Some examples
puts "Results with find8_2"
puts find8_2("123 ABCDEF 12345678 GHIJKLMN") # => "12345678" 
puts find8_2("12345678 ABCD 1234 EFGHIJKL")  # => "12345678" 
puts find8_2("123 4567 12345678")            # => "12345678" 
puts find8_2("123 4567 1234567")             # => nil 
puts find8_2("123456789")                    # => nil

注意对于此解决方案,如果您使用arr.select而不是arr.find,则该方法将返回一个数组,其中包含字符串中存在的所有8位数的子字符串。

感谢@CarySwoveland帮助我改进答案。