这是我文件的一部分:
project(':facebook-android-sdk-3-6-0').projectDir = new File('facebook-android-sdk-3-6-0/facebook-android-sdk-3.6.0/facebook')
project(':Forecast-master').projectDir = new File('forecast-master/Forecast-master/Forecast')
project(':headerListView').projectDir = new File('headerlistview/headerListView')
project(':library-sliding-menu').projectDir = new File('library-sliding-menu/library-sliding-menu')
我需要提取libs的名称。这是我的红宝石功能:
def GetArray
out_file = File.new("./out.txt", "w")
File.foreach("./file.txt") do |line|
l=line.scan(/project\(\'\:(.*)\'\).projectDir/)
File.open(out_file, "w") do |f|
l.each do |ch|
f.write("#{ch}\n")
end
end
puts "#{l} "
end
end
我的函数返回:
[]
[["CoverFlowLibrary"]]
[["Android-RSS-Reader-Library-master"]]
[["library"]]
[["facebook-android-sdk-3-6-0"]]
[["Forecast-master"]]
我的问题是我在out_file
找不到任何内容。我怎么写文件?否则,我只需要在文件中获取lib的名称。
答案 0 :(得分:1)
默想:
"project(':facebook-android-sdk-3-6-0').projectDir'".scan(/project\(\'\:(.*)\'\).projectDir/)
# => [["facebook-android-sdk-3-6-0"]]
scan
看到捕获(...)
时,它将创建一个子数组。这不是你想要的。下意识的反应是flatten
得到的阵列数组,但由于你选择了错误的方法,所以这只是代码的创可贴。相反,请考虑一下:
"project(':facebook-android-sdk-3-6-0').projectDir'"[/':([^']+)'/, 1]
# => "facebook-android-sdk-3-6-0"
这是使用String的[]
方法将正则表达式应用于捕获并返回捕获的文本。没有创建子数组。
scan
是强大的,绝对有它的位置,但不是这种"找到一件事"解析。
关于您的代码,我会执行类似以下未经测试的代码:
def get_array
File.new('./out.txt', 'w') do |out_file|
File.foreach('./file.txt') do |line|
l = line[/':([^']+)'/, 1]
out_file.puts l
puts l
end
end
end
GetArray
应为get_array
。另外,不要使用" get _"开始方法,不要将其称为array
;使用to_a
是惯用的。构建正则表达式时,请从简单开始,尽力保持简单。它是一种可维护性的东西,有助于减少精神错乱。 /':([^']+)'/
更易于阅读和理解,并且与您过于复杂的模式完成相同的操作。正则表达式引擎是贪婪和懒惰的,并且希望尽可能少地工作,这有时是完全邪恶的,但是一旦你理解了他们正在做什么,就可以编写非常小/简洁的模式来实现大的东西。
打破它,它基本上说"找到第一个':
然后开始捕捉文字直到下一个'
,这是你正在寻找的。 project(
可以忽略).projectDir
。
实际上,
/':([^']+)'/
真的可以写
/:([^']+)'/
但我感到很慷慨,并且也在寻找领先的'
。
答案 1 :(得分:0)
问题是你要打开文件两次:一次进入:
out_file = File.new("./out.txt", "w")
然后每行一次:
File.open(out_file, "w") do |f| ...
请改为尝试:
def GetArray
File.open("./out.txt", "w") do |f|
File.foreach("./file.txt") do |line|
l=line.scan(/project\(\'\:(.*)\'\).projectDir/)
l.each do |ch|
f.write("#{ch}\n")
end # l.each
end # File.foreach
end # File.open
end # def GetArray