Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何从字符串数组中提取数字?(我使用正则表达式)_Ruby_Regex - Fatal编程技术网

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

Ruby 如何从字符串数组中提取数字?(我使用正则表达式),ruby,regex,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/>ShipCod

我有一个字符串数组

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.join.scan(/(?<=Test: )[0-9]+/)
=> ["3", "7"]

您可以使用splat运算符(即
*
)为找到的每个范围(即
N-N
)创建一个新的
范围
),并组合结果,如下图1所示:

下面是在正则表达式中使用两个捕获的缩短选项,如下所示


您可以使用splat运算符(即
*
)为找到的每个范围(即
N-N
)创建一个新的
范围
),并组合结果,如下图1所示:

下面是在正则表达式中使用两个捕获的缩短选项,如下所示


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

test.flat_map do |s|
  _, m, n = *s.match(/Test:\s*(\d+)(?:-(\d+))?/)
  m ? (m..n||m).to_a : []
end
请在repl.it上查看它的实际操作:

或者更简洁地说:

test.flat_map {|s| s.match(/Test:\s*(\d+)(?:-(\d+))?/) { $1..($2||$1) }.to_a }

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

test.flat_map do |s|
  _, m, n = *s.match(/Test:\s*(\d+)(?:-(\d+))?/)
  m ? (m..n||m).to_a : []
end
请在repl.it上查看它的实际操作:

或者更简洁地说:

test.flat_map {|s| s.match(/Test:\s*(\d+)(?:-(\d+))?/) { $1..($2||$1) }.to_a }
只是出于好奇:

test.
  join.
  scan(/(?<=Test: )[\d-]+/).
  map { |e| e.gsub(/\A\d+\Z/) { |m| "#{m}..#{m}" }.gsub('-', '..') }.
  map(&method(:eval)).
  flat_map(&:to_a)
测试。
参加
扫描(/(?只是出于好奇:

test.
  join.
  scan(/(?<=Test: )[\d-]+/).
  map { |e| e.gsub(/\A\d+\Z/) { |m| "#{m}..#{m}" }.gsub('-', '..') }.
  map(&method(:eval)).
  flat_map(&:to_a)
测试。
参加


扫描(/(?数字总是一位数吗?不,我可能是两位数或三位数。一步一步地做:1)提取
“3-7”
“9”
,2)找出如何将
“3-7”
转换为
['3'、'4'、'5'、'6'、'7']
,3)合并结果是否数字总是一位数?不,我可能是两位数或三位数。一步一步地做:1)提取
“3-7”
“9”
,2)找出如何将
“3-7”
转换为
['3'、'4'、'5'、'6'、'7']
,3)组合结果谢谢,但还有额外的
8
,这是一种可以同时包含
测试:1
(测试:和1之间有空格)的方法和
测试:1
(测试:和1之间没有空格)?@iceツ 我也想到了这个,但是
Range.new
需要2..3个参数,所以不能适用于所有情况。
flat_map{r}Range.new(*r.split('-')。value_at(0,-1))。to_a}
可以同时适用于
a-b
符号和单个值。@Gerry我很高兴我的回答没有
join
,所以欢迎您使用。谢谢您,但是有多余的
8
,不应该在那里。有一种方法可以同时包含
Test:1
(Test:1和
Test:1之间有空格)和
Test:1
(Test:1和1之间没有空格)?@iceツ 我也想到了这个,但是
Range.new
需要2..3个参数,所以不能适用于所有情况。
flat_map{r}Range.new(*r.split('-')。value_at(0,-1))。to_a}
可以同时适用于
a-b
符号和单个值。@Gerry我很高兴我的回答没有
join
,所以欢迎您使用它。有趣而简洁的解决方案!顺便说一句,你可以得到准确的所需输出(字符串而不是数字)删除
到i
。由于OP需要一个字符串数组,你可以将其缩短为
m.upto(n | | m);我更新了我的答案。我真的很喜欢这个答案,尤其是“简洁”的版本。因此,为了好玩,@engineersmnky上提供的基准测试,编写它很有趣。我对基准测试结果并不感到惊讶<代码>数组#连接
优化得很好。有趣且简洁的解决方案!顺便说一句,你可以得到准确的所需输出(字符串而不是数字)删除
到i
。由于OP需要一个字符串数组,你可以将其缩短为
m.upto(n | | m);我更新了我的答案。我真的很喜欢这个答案,尤其是“简洁”的版本。因此,为了好玩,@engineersmnky上提供的基准测试,编写它很有趣。我对基准测试结果并不感到惊讶<代码>数组#连接
经过了很好的优化。
test.flat_map do |s|
  _, m, n = *s.match(/Test:\s*(\d+)(?:-(\d+))?/)
  m ? (m..n||m).to_a : []
end
test.flat_map {|s| s.match(/Test:\s*(\d+)(?:-(\d+))?/) { $1..($2||$1) }.to_a }
test.
  join.
  scan(/(?<=Test: )[\d-]+/).
  map { |e| e.gsub(/\A\d+\Z/) { |m| "#{m}..#{m}" }.gsub('-', '..') }.
  map(&method(:eval)).
  flat_map(&:to_a)