我有一个字符串数组
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/>"]
Run Code Online (Sandbox Code Playgroud)
我想要抓住的号码后Test:,其上面的字符串的阵列中是3,4,5,6,7(范围3-7)和9
期望的输出:
["3","4","5","6","7","9"]
Run Code Online (Sandbox Code Playgroud)
到目前为止我尝试了什么
test.join.scan(/(?<=Test: )[0-9]+/)
=> ["3", "7"]
Run Code Online (Sandbox Code Playgroud)
如何处理范围?
第二个测试案例:
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/>"]
Run Code Online (Sandbox Code Playgroud)
期望的输出:
["3","4","5","6","7","9","15","16","17","18"]
Run Code Online (Sandbox Code Playgroud)
有很多方法可以解决这个问题.我可能会这样做:
test.flat_map do |s|
_, m, n = *s.match(/Test:\s*(\d+)(?:-(\d+))?/)
m ? (m..n||m).to_a : []
end
Run Code Online (Sandbox Code Playgroud)
看到它在repl.it行动:https://repl.it/JFwT/13
或者,更简洁:
test.flat_map {|s| s.match(/Test:\s*(\d+)(?:-(\d+))?/) { $1..($2||$1) }.to_a }
Run Code Online (Sandbox Code Playgroud)