【问题标题】:Get the path using regex in .each iterator [closed]在.each迭代器中使用正则表达式获取路径[关闭]
【发布时间】:2016-05-13 05:44:41
【问题描述】:

我需要将我的正则表达式 /\/([^\)]+)\// 放在下面的代码中的什么位置,才能从给定数组中的完整路径中仅获取 block1block2 路径?

def path_from_array(array)
  array.each do |var|
    yield var
  end
end

puts path_from_array(['path/block1/something', 'path/block2']) { |x| x.to_s } 

现在的输出是:

path/block1/something
path/block2/

我需要:

block1
block2

【问题讨论】:

  • 非常不清楚你在问什么 - 你是在问如何使用正则表达式?
  • 如何在获取块的迭代器中使用它。我需要以某种方式使用正则表达式从数组中的完整路径名中获取我的“块”。

标签: arrays ruby regex iterator


【解决方案1】:

我认为您首先使用了错误的正则表达式,请尝试使用此正则表达式:

/\/(.*)\//

其次,要使用正则表达式,您需要类似以下内容:

def path_from_array(array)
  array.each do |var|
     if ( var =~ /\/(.*)\// )
        puts var.scan(/\/(.*)\//);
     end
  end
end

puts path_from_array(['path/block1/something', 'path/block2']) { |x| x.to_s }

解释:

  • var =~ 会找到正则表达式并返回一个布尔值。
  • var.scan 将返回找到的匹配项。

这里有一些关于正则表达式和 Ruby 的资源:

【讨论】:

  • 使用%r 避免倾斜牙签综合症:/\/(.*)\// # => /\/(.*)\// 所以使用%r!/(.*)/! # => /\/(.*)\// 会产生相同的正则表达式。
  • 谢谢,所以不用yield了?
  • 其实我可能会使用yield,我只是使用“puts”来调试线路
【解决方案2】:

不需要正则表达式:

['path/block1/something', 'path/block2'].map { |path|
  path.split('/')[1]
} # => ["block1", "block2"]

正则表达式很棒,但并非所有东西都适合它们。

如果您要在这些操作系统上处理包含 Windows 或 *nix 路径的路径,那么您会希望您的代码根据操作系统自动调整:

path.split(File::SEPARATOR)[1]

【讨论】:

  • 感谢您的回答,但我需要使用方法而不是仅.map
  • 然后将该行放入方法中的块中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-20
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 2015-08-14
相关资源
最近更新 更多