首页 文章

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

提问于
浏览
1

我有一个文件与多个(多)空格分隔浮动 . 花车数量可能会有所不同 . 为了论证,让我们说它是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 回答

  • 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

    NOTE [-+]?[0-9]*\.?[0-9]+(?:[eE][-+]?[0-9]+)? 正则表达式匹配整数OR浮点值 . 要仅匹配浮点数,请使用 [-+]?[0-9]*\.[0-9]+(?:[eE][-+]?[0-9]+)? (在 \. 之后删除可选的 - 一次或零次出现 - ? 量词) .

相关问题