使用ruby在字符串中提取路径

时间:2015-11-13 12:51:42

标签: ruby-on-rails ruby regex rake

我编写了一个ruby脚本,我在其中遍历文件夹,并搜索以" .xyz"结尾的文件名。 。在这些文件中,我搜索具有以下结构的行:

<ClCompile Include="..\..\..\Projects\Project_A\Applications\Modules\Sources\myfile.c"/>

到目前为止,这对脚本起作用了:

def parse_xyz_files
  files = Dir["./**/*.xyz"]
  files.each do |file_name|
    puts file_name
    File.open(file_name) do |f|
      f.each_line { |line|
        if line =~ /<ClCompile Include=/
          puts "Found #{line}"
        end 
      }
  end
  end
  end

现在我想只提取双引号之间的字符串,在这个例子中:

..\..\..\Projects\Project_A\Applications\Modules\Sources\myfile.c

我试图用这样的东西(用匹配方法)来做:

def parse_xyz_files
  files = Dir["./**/*.xyz"]
  files.each do |file_name|
    puts file_name
    File.open(file_name) do |f|
      f.each_line { |line|
        if line =~ /<ClCompile Include=/.match(/"([^"]*)"/)
            puts "Found #{line}"
          end

      }
  end
  end
  end

正则表达式到目前为止确定(用rubular检查)。知道如何以简单的方式做到这一点吗?我对红宝石很新。

2 个答案:

答案 0 :(得分:0)

您可以使用String#scan方法:

line = '<ClCompile Include="..\..\..\Projects\Project_A\Applications\Modules\Sources\myfile.c"/>'

path = line.scan(/".*"/).first

或者如果您的<CICompile>标记可以包含其他一些属性:

path = line.scan(/Include="(.*)"/).first.first

但使用XML解析器肯定是一个更好的主意。

答案 1 :(得分:0)

使用Nokogiri解析XML而不是正则表达式。

require 'nokogiri'
xml = '<foo><bar><ClCompile Include="..\..\..\Projects\Project_A\Applications\Modules\Sources\myfile.c"/></bar></foo>'
document = Nokogiri::XML xml
d.xpath('//ClCompile/@Include').text