我需要能够从给定的字符串中提取8个数字的序列。序列不是从字符串到字符串位于相同的位置,并且可以包含任何8位数字。
要从中提取的字符串示例:
"123 ABCDEF 12345678 GHIJKLMN"
"12345678 ABCD 1234 EFGHIJKL"
"123 4567 12345678"
在上面的每个字符串中,我只需要12345678
。
我已尝试匹配正则表达式/\d+/
,但如果在12345678
之前显示任何数字,则无效。
答案 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帮助我改进答案。