我想要以下子字符串
1100110011110000
这
foo = "bar9-9 '11001100 11110000 A'A\n"
到目前为止,我使用了以下内容,产生了
puts foo.split(',').map!(&:strip)[0].gsub(/\D/, '')
>> 991100110011110000
在这种情况下摆脱2个领先的9并不是太困难,但我想要一个只在' '
单引号内抓取数字的通用解决方案
答案 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"