防止嵌套组破坏正则表达式匹配(TCL)

时间:2016-10-20 20:44:32

标签: regex tcl

我有一个包含多个(多个)空格分隔浮点数的文件。花车数量可能会有所不同。为了论证,让我们说它是5.我从这个教程页面中选择了一个正则表达式:

www.regular-expressions.info/floatingpoint.html

[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?

为了捕获多个浮点数,我将其添加到一个组中添加了一些空格并再次将其分组?量词。

(([-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s+)+

据我所知,已经创建了嵌套组,这就是我的知识结束的地方。当我测试正则表达式时,我得到了'子'组的不希望的匹配,即指数。

所以我的问题是:我如何仅捕获作为我的完整花车的“第一级”组?

样本测试数据集(注意不同的空格数):

set x "  1.0034e-09 -0.34e+07    -3 0.46   3.445e+03   "

谢谢, 格特

1 个答案:

答案 0 :(得分:2)

您的表达式包含嵌套捕获组的事实并不意味着您将能够访问这些重复捕获,唯一可访问的将是在上一次迭代期间捕获的文本。

此外,每个捕获组都在Tcl中返回,如果您不需要,将所有捕获组转换为非捕获组(([eE][-+]?[0-9]+)?) => (?:[eE][-+]?[0-9]+)?)。

要匹配测试集中的所有数字,您可以使用

set x {  1.0034e-09 -0.34e+07    -3 0.46   3.445e+03   }
set RE {[-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?}
set res [regexp -all -inline $RE $x]
puts $res

请参阅IDEONE demo

注意 [-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)?正则表达式匹配整数 float 值。要仅匹配浮动,请使用[-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)?(在?之后删除可选的 - 一次或零次 - \.量词。< / p>