ruby:仅在引号内抓取数字

时间:2018-04-03 16:06:16

标签: ruby regex

我想要以下子字符串

1100110011110000

foo = "bar9-9 '11001100 11110000 A'A\n"

到目前为止,我使用了以下内容,产生了

puts foo.split(',').map!(&:strip)[0].gsub(/\D/, '')
>> 991100110011110000

在这种情况下摆脱2个领先的9并不是太困难,但我想要一个只在' '单引号内抓取数字的通用解决方案

3 个答案:

答案 0 :(得分:2)

您可以先使用scan找到引用的部分,然后删除非数字:

> results = "bar9-9 '11001100 11110000 A'A\n".scan(/'[^']*'/).map{|m| m.gsub(/\D/, '')}
# => ["1100110011110000"]
> results[0]
# => "1100110011110000"

答案 1 :(得分:1)

引用字符串中的0和1可以使用带有正则表达式的String#gsub提取,而不是将字符串转换为字符串数组的方法,修改数组并将其转换回字符串。这有三种方法。

str ="bar9-9 '11001100 11110000 A'A\n"

#1:提取感兴趣的子字符串,然后删除0和1以外的字符

def extract(str)
  str[str.index("'")+1, str.rindex("'")-1].gsub(/[^01]/,'')
end

extract str
  #=> "1100110011110000"

#2使用标记表示何时保留零和

def extract(str)
  found = false
  str.gsub(/./m) do |c|
    found = !found if c == "'" 
    (found && (c =~ /[01]/)) ? c : ''
  end
end

extract str
  #=> "1100110011110000"

此处正则表达式需要m修饰符(以启用多行模式)才能将换行符转换为空字符串。 (或者可以写str.chomp.gsub(/./)...。)

请注意,当存在多个单引号子串时,第二种方法会起作用。

extract "bar9-9 '11001100 11110000 A'A'10x1y'\n"
  #=> "1100110011110000101"

#3使用flip-flop运算符(#2的变体)

def extract(str)
  str.gsub(/./m) do |c|
    next '' if (c=="'") .. (c=="'")
    c =~ /[01]/ ? c : ''
  end
end

extract str
  #=> "1100110011110000"
extract "bar9-9 '11001100 11110000 A'A'10x1y'\n"
  #=> "1100110011110000101"

答案 2 :(得分:0)

foo.slice(/'.*?'/).scan(/\d+/).join
 #=> "1100110011110000"