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

问题描述

| 我有一个脚本,用于处理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,\"\\n\"
    }
我的问题在于最后一行-如果我没有全部使用它们-我是否仍然必须全部声明它们,以使其正常工作并保持正确的顺序? 元素5和7可能会在以后使用,但就目前而言,它们只是正则表达式的一部分,以提高将来的灵活性。     

解决方法

您可以使用数组而不是显式变量列表,然后按索引从数组中选择内容:
string.scan(/regex/m) { |a|
    print a[0],a[1] + \".ext\",a[2].to_f / 25400000,a[3].to_f / 25400000,a[5],\"\\n\"
}
要么重新编写正则表达式以仅捕获所需内容。 您可以在列表中多次使用相同的变量,因此将不使用的名称重命名为
unused
可能是最简单的选择:
string.scan(/regex/m) { |a,b,c,d,unused,f,unused|
    print a,b + \".ext\",c.to_f / 25400000,d.to_f / 25400000,\"\\n\"
}
至少通过这种方式,很明显(或应该)您没有使用第五和第七次捕获。但是,这在1.9中不起作用,因此您必须在1.9中使用
unused1
unused2
。 理想的平衡方式是使用1.9 \的命名捕获组,但是
scan
不允许您访问它们。     ,由于您将变量作为块变量获取,因此无法跳过该顺序。问题出在你的正则表达式上。如果您有不想捕获的组,则应使用不适应的组
(?: )
而不是捕获组
( )
。因此,将正则表达式中的第五个和第七个
( )
更改为
(?: )
。如果您使用ruby 1.9或在ruby 1.8.7上使用oniguruma regex引擎,那么您也可以使用命名捕获;例如,在正则表达式中使用“ 11”,并将在块中捕获的字符串称为“ 12”或“ 13”。