Ruby动态填充二维数组

Ruby动态填充二维数组,ruby,Ruby,我正在研究分析SQL代码的解析器,以便尝试处理所有的块注释。我提出了通过索引处理正则表达式的解决方案,以查看它是否在注释块内,并为此尝试在下面的代码中填充2维数组,其中第二个元素是文本,比如s。不确定这是否可行。我试过一颗宝石,但失败了。 我的目标是让数组像 全部=[[9,'s'],[19,'s'],[24,'s']] 参考下面的例子。最终目标是大量处理遗留SQL代码。。查找具有特定关键字的活动行。最好的 x = 'line:xss /* */ /* /* CODE_Comment

我正在研究分析SQL代码的解析器,以便尝试处理所有的块注释。我提出了通过索引处理正则表达式的解决方案,以查看它是否在注释块内,并为此尝试在下面的代码中填充2维数组,其中第二个元素是文本,比如s。不确定这是否可行。我试过一颗宝石,但失败了。 我的目标是让数组像

全部=[[9,'s'],[19,'s'],[24,'s']] 参考下面的例子。最终目标是大量处理遗留SQL代码。。查找具有特定关键字的活动行。最好的

x = 'line:xss /*   */   /*   /*  CODE_Comment */  '
     puts x

    i = -1
    all = [[],[]]
    while i = x.index('/*',i+1)             
do   all << i   ####<@>>< how to add literal to second element ???
    end
    puts all  

您可以执行以下操作

str = 'line:xss /*   */   /*   /*  CODE_Comment */  '
看。继续之前,让我们重置枚举器:

enum1.rewind
看。其次,

和印刷品

_ = /*, a = []
md = /*, b = 9
a = [[9, "s"]]

_ = /*, a = [[9, "s"]]
md = /*, b = 19
a = [[9, "s"], [19, "s"]]

_ = /*, a = [[9, "s"], [19, "s"]]
md = /*, b = 24
a = [[9, "s"], [19, "s"], [24, "s"]]
我使用了一个下划线作为第一个块变量的占位符,以表示在块计算中不使用它,这是一种常用的约定。为了构造数组,我们需要字符串str中匹配的偏移量。为此,我们首先获取该匹配生成的MatchData实例,请参见,然后使用该方法获取匹配开始的偏移量。最后,我们将所需的2元素数组附加到


Regexp.last\u match的值由全局变量$~,因此该变量有时用于代替Regexp.last\u match。

您可以将'all'初始化为[]数组,然后将数组插入其中。没有特殊的初始化需要使它2维。若要制作2d数组,请创建一个1d数组,然后在其中放置一个或多个数组。我不清楚您希望在数组中使用x的哪些位,或者数组中的数字代表什么,但若要在I之后添加“s”,您将执行所有操作。问题解决了。我只需要处理正则表达式每次出现的索引,它应该是每个失败的行。它不是一个足够精确的错误描述,我们无法帮助您。什么不起作用?它怎么不起作用?你的代码有什么问题?你收到错误信息了吗?错误消息是什么?你得到的结果不是你期望的结果吗?你期望得到什么样的结果?为什么?你会得到什么样的结果?两者有什么不同?你观察到的行为是否不是期望的行为?期望的行为是什么?为什么?观察到的行为是什么?它们有什么不同?
enum1.next #=> "/*" 
enum1.next #=> "/*" 
enum1.next #=> "/*" 
enum1.next #=> StopIteration (iteration reached an end)
enum1.rewind
enum2 = enum1.with_object([])
  #=> #<Enumerator: #<Enumerator: "line:xss /*   */   /*   /*  CODE_Comment */  "
  #     :gsub(/\/\*/)>:with_object([])> 
enum2.next #=> ["/*", []] 
enum2.next #=> ["/*", []] 
enum2.next #=> ["/*", []] 
enum2.next #=> StopIteration (iteration reached an end) 
enum2.rewind
enum2.each do |_,a|
  puts "\n_ = #{_}, a = #{a}"
  md = Regexp.last_match
  b= md.begin(0) 
  puts "md = #{md}, b = #{b}"
  a << [b, 's']
  puts "a = #{a}"
end
  #=> [[9, "s"], [19, "s"], [24, "s"]] 
_ = /*, a = []
md = /*, b = 9
a = [[9, "s"]]

_ = /*, a = [[9, "s"]]
md = /*, b = 19
a = [[9, "s"], [19, "s"]]

_ = /*, a = [[9, "s"], [19, "s"]]
md = /*, b = 24
a = [[9, "s"], [19, "s"], [24, "s"]]