我编写了一个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检查)。知道如何以简单的方式做到这一点吗?我对红宝石很新。
答案 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