我有一個字串
"Param 1: 1, Some text: 2, Example3: 3, Example4: 4"
我想將其轉換為陣列:
["Param 1","Some text","Example3","Example4"]
[1,2,3,4]
如何?
uj5u.com熱心網友回復:
在 Ruby 中有很多方法可以做到這一點。
您可以先按對的分隔符(逗號)拆分,然后使用 map 進一步按鍵/對分隔符(冒號)拆分:
pairs = s.split(/,\s*/).map { |s| s.split(/:\s*/) }
keys = pairs.map(&:first)
values = pairs.map(&:last)
(這里和下面s是你的原始字串)
您可以使用scan在單個呼叫中匹配鍵/值(免責宣告:這并不意味著這更有效 - 正則運算式并不神奇)
pairs = s.scan(/(?<key>[^:] ):\s*(?<value>[^,] )[,\s]*/)
keys = pairs.map(&:first)
values = pairs.map(&:last)
(這里不需要命名捕獲——scan它們沒有任何好處——但我把它們放在正則運算式中可以說更具可讀性)
您可以按所有分隔符進行拆分,然后用于Enumerable#partition將鍵與值分開,smth。喜歡:
keys, values = s.split(/:\s*|,\s*/).partition.with_index { |_, i| i.even? }
等等...
uj5u.com熱心網友回復:
輸入
a = "Param 1: 1, Some text: 2, Example3: 3, Example4: 4"
代碼
obj= a.split(',').map { |x| x.split(':') }
p obj.map(&:first).map(&:strip)
p obj.map(&:last)
結果
["Param 1", "Some text", "Example3", "Example4"]
[" 1", " 2", " 3", " 4"]
uj5u.com熱心網友回復:
這是一個使用多重賦值創建 2 個新命名陣列的單行代碼:
a1, a2 = (n = str.split(", ").map{|x| x.split(": ")}.transpose)[0], n[1]
a1 #=> ["Param 1", "Some text", "Example3", "Example4"]
a2 #=> ["1", "2", "3", "4"]
盡管在之前的建議中已經以一種或另一種形式提到了該解決方案的大部分內容,但我更喜歡這種組合方法而不是其他提到的方法,原因如下:
- 它不使用正則運算式,這使得它比其他一些建議執行得更快。實際上,在運行了一些快速基準測驗之后,它看起來實際上比目前列出的其他非正則運算式解決方案執行得更快。
- 它同時創建 2 個唯一且單獨命名的陣列以供使用(而不是僅創建具有 2 個子陣列的陣列)。
- 它以一條線完成整個操作。
uj5u.com熱心網友回復:
您可以將String#split與正則運算式一起使用,然后將回傳的值配對并轉置:
str = "Param 1: 1, Some text: 2, Example3: 3, Example4: 4"
str.split(/[:,] /).each_slice(2).to_a.transpose
#=> [["Param 1", "Some text", "Example3", "Example4"],
# ["1", "2", "3", "4"]]
步驟如下。
a = str.split(/[:,] /)
#=> ["Param 1", "1", "Some text", "2", "Example3", "3", "Example4", "4"]
正則運算式讀作“匹配一個冒號或逗號后跟一個或多個空格”。
enum = a.each_slice(2)
#=> #<Enumerator: ["Param 1", "1", "Some text", "2", "Example3",
# "3", "Example4", "4"]:each_slice(2)>
b = enum.to_a
#=> [["Param 1", "1"], ["Some text", "2"], ["Example3", "3"],
# ["Example4", "4"]]
b.transpose
#=> [["Param 1", "Some text", "Example3", "Example4"],
# ["1", "2", "3", "4"]]
這是執行計算的第二種方法,我沒有解釋,只是說它使用String#gsub的形式,它接受一個引數并且沒有塊,回傳一個可以鏈接到Enumerator#with_object 的列舉數。gsub與其他形式不同,這種形式的不執行字符替換(因此可能被認為是錯誤命名的)。相反,它回傳的列舉器生成其引數的匹配項,這里是一個正則運算式。
str.gsub(/[a-z][a-z ] \d*(?=:)|\d (?![^,])/i).with_object([[],[]]) do |s,(a,b)|
(s[0].match?(/\d/) ? b : a) << s
end
#=> [["Param 1", "Some text", "Example3", "Example4"],
# ["1", "2", "3", "4"]]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/397321.html
