Ruby中未使用的正则表达式捕获

Ruby中未使用的正则表达式捕获,ruby,regex,arrays,string,block,Ruby,Regex,Arrays,String,Block,我有一个脚本,用于处理CAD程序中的文件内容,以便在另一个CAD程序中使用。块中未使用的变量是否可以跳过或写入?剧本可以很好地与他们在一起,我只是好奇是否有一个更干净的方式来写它。多谢各位 string = IO.read("file.txt") string.scan(/regex/m) {|a,b,c,d,e,f,g| # captures 7 items, I use 1-4, & 6 below, skipping 5 & 7 pri

我有一个脚本,用于处理CAD程序中的文件内容,以便在另一个CAD程序中使用。块中未使用的变量是否可以跳过或写入?剧本可以很好地与他们在一起,我只是好奇是否有一个更干净的方式来写它。多谢各位

    string = IO.read("file.txt")

    string.scan(/regex/m) {|a,b,c,d,e,f,g|

    # captures 7 items, I use 1-4, & 6 below, skipping 5 & 7

    print a, b+".ext", c.to_f/25400000, d.to_f/25400000, f,"\n"
    }
我的问题在于最后一行——如果我没有全部使用它们——我是否还必须全部声明它们,以使其正常工作并保持正确的顺序


元素5和7可能会在以后使用,但现在,它们只是正则表达式的一部分,以便于将来的灵活性。

由于您将变量作为块变量获取,因此不能跳过顺序。问题在于你的正则表达式。如果您有不想捕获的组,则应使用取消捕获组
(?:)
,而不是捕获组
()
。因此,将正则表达式中的第五个和第七个
()
更改为
(?:)
。如果您使用的是ruby 1.9或ruby 1.8.7上的oniguruma regex引擎,那么您也可以使用命名捕获;例如,在正则表达式中使用
(?)
,并将块中捕获的字符串引用为
foo
$~[:foo]
,因为您将变量作为块变量获取,所以不能跳过顺序。问题在于你的正则表达式。如果您有不想捕获的组,则应使用取消捕获组
(?:)
,而不是捕获组
()
。因此,将正则表达式中的第五个和第七个
()
更改为
(?:)
。如果您使用的是ruby 1.9或ruby 1.8.7上的oniguruma regex引擎,那么您也可以使用命名捕获;例如,在正则表达式中使用
(?)
,并将块中捕获的字符串引用为
foo
$~[:foo]

您可以使用数组而不是显式的变量列表,然后通过索引从数组中选取内容:

string.scan(/regex/m) { |a|
    print a[0], a[1] + ".ext", a[2].to_f / 25400000, a[3].to_f / 25400000, a[5], "\n"
}
或者修改正则表达式以只捕获所需内容

您可以在列表中多次使用同一变量,因此仅将不使用的对象重命名为未使用的对象可能是最简单的选择:

string.scan(/regex/m) { |a, b, c, d, unused, f, unused|
    print a, b + ".ext", c.to_f / 25400000, d.to_f / 25400000, f, "\n"
}
至少通过这种方式,很明显(或者应该)您没有使用第五和第七次捕获。但是,这在1.9中不起作用,因此您必须在1.9中使用
unused1
unused2


理想的平衡是使用1.9的命名捕获组,但
scan
不允许您访问它们。

您可以使用数组而不是显式的变量列表,然后通过索引从数组中选择内容:

string.scan(/regex/m) { |a|
    print a[0], a[1] + ".ext", a[2].to_f / 25400000, a[3].to_f / 25400000, a[5], "\n"
}
或者修改正则表达式以只捕获所需内容

您可以在列表中多次使用同一变量,因此仅将不使用的对象重命名为未使用的对象可能是最简单的选择:

string.scan(/regex/m) { |a, b, c, d, unused, f, unused|
    print a, b + ".ext", c.to_f / 25400000, d.to_f / 25400000, f, "\n"
}
至少通过这种方式,很明显(或者应该)您没有使用第五和第七次捕获。但是,这在1.9中不起作用,因此您必须在1.9中使用
unused1
unused2


理想的平衡是使用1.9的命名捕获组,但
scan
不允许您访问它们。

您的第一个示例更接近我从一开始就试图完成的任务,但我一直在使用“NoMethodError”,试图通过扫描将文件捕获为数组。它看起来也更优雅-因此,如果我决定以后使用它们(不修改正则表达式),现在我可以添加“a[5]”和“a[7]”-谢谢;-)@tahwos:使用数组的问题在于它将索引源(即正则表达式中的捕获组)与使用索引的位置分开,这很容易出错。第二种方法将所有功能保持在一起,并且更易于维护。我认为一个稍微难看但可维护的解决方案远远优于一个优雅但脆弱的解决方案。我发现这是一个艰难的过程——要么我没有充分地分离它们,要么我分离得太多。我希望我能对你的第一个例子投两次票-因为它非常适合我的原始脚本,它使用IO.readlines(file.split)来处理一个简单得多的文本文件。谢谢你提供关于1.9的更多信息。。。我已经习惯了1.8.6,据我所知,1.8.7对很多事情来说都是另一回事,尤其是当你超过1.9的时候。这让我甚至不敢去探索它,因为我担心我将不得不重新学习所有已经对我有用的东西。你的第一个例子更接近我从一开始就试图完成的事情,但我一直得到“NoMethodError”,试图通过扫描将文件捕获为数组。它看起来也更优雅-因此,如果我决定以后使用它们(不修改正则表达式),现在我可以添加“a[5]”和“a[7]”-谢谢;-)@tahwos:使用数组的问题在于它将索引源(即正则表达式中的捕获组)与使用索引的位置分开,这很容易出错。第二种方法将所有功能保持在一起,并且更易于维护。我认为一个稍微难看但可维护的解决方案远远优于一个优雅但脆弱的解决方案。我发现这是一个艰难的过程——要么我没有充分地分离它们,要么我分离得太多。我希望我能对你的第一个例子投两次票-因为它非常适合我的原始脚本,它使用IO.readlines(file.split)来处理一个简单得多的文本文件。谢谢你提供关于1.9的更多信息。。。我已经习惯了1.8.6,据我所知,1.8.7对很多事情来说都是另一回事,尤其是当你超过1.9的时候。这让我甚至不敢去探索它,因为我担心我将不得不重新学习所有已经对我有用的东西。由于接收应用程序的限制,我实际上使用的是1.8.6。脚本将从接收应用程序内部运行,以从另一个应用程序导入文件。巧合的是,我就是我们