如何从字符串数组中提取数字?(我正在使用正则表达式)

Kav*_*cat 1 ruby regex

我有一个字符串数组

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)

Jor*_*ing 5

有很多方法可以解决这个问题.我可能会这样做:

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)

https://repl.it/JFwT/11

  • 有趣而又整洁的解决方案!顺便说一句,你可以得到删除`to_i`的确切所需输出(字符串而不是数字). (4认同)
  • 由于OP想要一个字符串数组,你可以将它缩短为`m.upto(n || m).to_a` (2认同)
  • 我非常喜欢这个答案,特别是"简洁"版本.所以只需通过https://repl.it/JFwT/16获取有趣的基准测试 (2认同)