我有一个字符串数组
test= ["ChangeServer<br/>Test: 3-7<br/>PinCode:DFSFSDFB04008<br/>ShipCode:DFADFSDFSDM-000D3<br/>SomeCode:sdfsdf", "werwerwe", "adfsdfsd",
"sdfsdfsdfsd<br/>Test: 9<br/>PinCode:ADFSDF4NS0<br/>ShipCode:FADFSDFD-9ZM170<br/>"]我想在Test:之后获取数字,在上面的字符串数组中是3、4、5、6、7 (范围3-7)和9。
期望输出:
["3","4","5","6","7","9"]到目前为止我尝试过的
test.join.scan(/(?<=Test: )[0-9]+/)
=> ["3", "7"]如何处理范围?
第二个测试用例:
test= ["ChangeServer<br/>Test: 3-7<br/>PinCode:DFSFSDFB04008<br/>ShipCode:DFADFSDFSDM-000D3<br/>SomeCode:sdfsdf", "werwerwe", "adfsdfsd",
"sdfsdfsdfsd<br/>Test: 9<br/>PinCode:ADFSDF4NS0<br/>ShipCode:FADFSDFD-9ZM170<br/>", "sdfsdfsdfsd<br/>Test: 15-18<br/>PinCode:ADFSDF4NS0<br/>ShipCode:FADFSDFD-9ZM170<br/>"]期望产出:
["3","4","5","6","7","9","15","16","17","18"]发布于 2017-06-28 17:22:27
有很多方法可以解决这个问题。我可能会这样做:
test.flat_map do |s|
_, m, n = *s.match(/Test:\s*(\d+)(?:-(\d+))?/)
m ? (m..n||m).to_a : []
end在repl.it:https://repl.it/JFwT/13上看到它的作用
或者,更简洁地说:
test.flat_map {|s| s.match(/Test:\s*(\d+)(?:-(\d+))?/) { $1..($2||$1) }.to_a }发布于 2017-06-28 18:03:43
只是出于好奇:
test.
join.
scan(/(?<=Test: )[\d-]+/).
map { |e| e.gsub(/\A\d+\Z/) { |m| "#{m}..#{m}" }.gsub('-', '..') }.
map(&method(:eval)).
flat_map(&:to_a)https://stackoverflow.com/questions/44807972
复制相似问题