Ruby 解析文件,查找字符串并存储下一个值

Ruby 解析文件,查找字符串并存储下一个值,ruby,arrays,string,file,parsing,Ruby,Arrays,String,File,Parsing,我需要根据不同的规则解析文件。 该文件包含几行。 我把文件一行一行地看了一遍。当我找到一个特定的字符串时,我必须存储下一行中的数据,直到找到一个特定的字符为止 文件示例: start { /* add comment */ first_step { sub_first_step { }; sub_second_step { code = 50, post = xxx (aaaaaa, b

我需要根据不同的规则解析文件。 该文件包含几行。 我把文件一行一行地看了一遍。当我找到一个特定的字符串时,我必须存储下一行中的数据,直到找到一个特定的字符为止

文件示例:

start {
  /* add comment */
  first_step {
     sub_first_step {
     };
     sub_second_step {
        code = 50,
        post = xxx (aaaaaa,
                    bbbbbb,
                    cccccc,
                    eeeeee),
        number = yyyy (fffffff,
                       gggggg,
                       jjjjjjj,
                       ppppppp),
     };
因此,在这种情况下:

 File.open(@file_to_convert, "r").each_line do |line|
在“行”中,我有我当前的行。我需要:

1) 当该行包含字符串“xxx”时查找

对吗

2) 在数组中存储下一个值(例如:aaaa、bbbb、ccccc、eeee),直到找到字符“)”。这将突出显示该部分已完成。 我想我们用字符串“xxxx”到达了这一行,我必须迭代块“if”中的下一行。

试试这个:

file_contents = File.read(@file_to_convert)

lines = file_contents[/xxx \(([^)]+)\)/, 1].split
# => ["aaaaaa,", "bbbbbb,", "cccccc,", "eeeeee"]

正则表达式(
xxx\([^)]+)\
)将
xxx(
直到下一个
之后的所有文本都提取出来,然后
split
将其拆分为各个项目。

它认为这就是您要寻找的:

looking = true
results = []
File.open(@file_to_convert, "r").each_line do |line|
  if looking
    if line.include?("xxx")
      looking = false
      results << line.scan(/\(([^,]*)/x)
    end
  else
    if line.include?(")")
      results << line.strip.delete('),')
      break
    else
      results << line.strip.delete(',')
    end
  end
end
puts results
looking=true
结果=[]
打开(@File_to_convert,“r”)。每行|
如果看
如果行。包括?(“xxx”)
看=假

结果我不明白你为什么要做
if行。包括?(“union”)然后
检查行中是否包含字符串
“xxx”
。因为我是ruby新手,所以这是我的第一个想法。但任何其他方法都是受欢迎的!!!在找到字符串“xxxx”之后,我必须存储这些值,直到找到字符“)”。我可以使用这个字符来终止迭代
looking = true
results = []
File.open(@file_to_convert, "r").each_line do |line|
  if looking
    if line.include?("xxx")
      looking = false
      results << line.scan(/\(([^,]*)/x)
    end
  else
    if line.include?(")")
      results << line.strip.delete('),')
      break
    else
      results << line.strip.delete(',')
    end
  end
end
puts results