我有一串整數,可以用逗號、連字符或兩者分隔。例如
str = '3,7-17,21'
我需要取這些數字并將它們減 1,而不會丟失它們在該字串中的位置。
當我拆分時,我會丟失逗號和連字符,因此它們的位置會發生變化。
有沒有一種很好的方法可以將我的字串變成2,6-16,20?
我從以下開始,但最終陷入了一個兔子洞:
def reduce_hours(hours)
hours
.enum_for(:scan, /\d /)
.map { Regexp.last_match(0) }
.map(&:to_i)
.map { |hour| hour - 1 }
.then { hours }
end
hours = '3,7-17,21'
它只回傳原始字串。當我除錯時,它確實單獨匹配數字并將它們減少 1。它只是不會將這些更改回傳到原始字串。我接近那個片段了嗎?
uj5u.com熱心網友回復:
enum_for(:scan, ...), Regexp.last_match(0), then– 你想多了。
您可以只使用gsub其前身替換每個數字子字串:
str = '3,7-17,21'
str.gsub(/\d /) { |hour| hour.to_i - 1 }
#=> "2,6-16,20"
需要往返,to_i因為字串不能直接遞減。
相反的方向更容易:(通過String#succ)
"2,6-16,20".gsub(/\d /, &:succ)
#=> "3,7-17,21"
uj5u.com熱心網友回復:
嘗試這個:
def process_comma(str)
str.split(',').map do |sub_str|
sub_str.include?('-') ? process_hiphen(sub_str) : (sub_str.to_i - 1).to_s
end.join(',')
end
def process_hiphen(str)
str.split('-').map do |sub_str|
(sub_str.to_i - 1).to_s
end.join('-')
end
str = '3,7-17,21'
process_comma(str) # "2,6-16,20"
uj5u.com熱心網友回復:
抱歉,它不是在 ruby?? 中,但這是我在 c# 中所做的基本上首先將其按組(逗號)拆分,然后處理每個組,例如單個數字或連字符號。
var str = "3,7-17,21";
var numSec = str.Split(',');
var reduced = numSec.Select(r=> string.Join('-', r.Split('-').Select(n=> Int32.Parse(n) - 1 )));
var reJoined = string.Join(',', reduced);
Console.WriteLine(reJoined);
uj5u.com熱心網友回復:
您可以通過每個可能的分隔符。
hours = '3,7-17,21'
def reduce_hours(hours)
hours
.split('-')
.map { |comma_seperated_strings|
comma_seperated_strings
.split(',')
.map(&:to_i)
.map{|x| x-1}
.map(&:to_s)
.join(',')
}
.join('-')
end
puts reduce_hours(hours)
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/503807.html
標籤:红宝石
