REGEXP非捕获组正在捕获TCL

p_c*_*cos 3 regex tcl

我有数据,见下文,我想在我的TCL脚本中使用REGEXP进行解析:

Mar 31 11:30:00 UTC+0100 2015
Mar 31 17:00:00 UTC+0100 2015
Mar 31 17:30:00 UTC+0100 2015
Apr 1 11:30:00 UTC+0100 2015
Apr 1 17:00:00 UTC+0100 2015
Apr 1 17:30:00 UTC+0100 2015
Apr 2 11:30:00 UTC+0100 2015
Run Code Online (Sandbox Code Playgroud)

我想从上面的数据中提取当月的日期.这是我到目前为止提出的正则表达式,我不知道为什么它不起作用.

(?:\w{3}\s)(\d{1,2})(?:\s)
Run Code Online (Sandbox Code Playgroud)

我在RegExr网站上用我的样本数据对它进行了测试,它似乎在那里正常工作; 它返回组中月份的日期,但是当我在我的TCL脚本中运行它时,它返回所有匹配,即返回非捕获组.

这里有什么我想念的吗?我对正则表达式并不满意.

谢谢.

编辑:

以下是我脚本中的代码示例.我有一个我正在读取的CSV文件,其中sData6列包含上面的日期/时间信息.

while {[gets $fInputFile line] >= 0} {
    set aAllOptions [split $line ,]
    lassign $aAllOptions sData1 sData2 sData3 sData4 sData5 sData6

    regexp -all {(?:\w{3}\s)(\d{1,2})(?:\s)} $sData6 regexData6

    puts "Printing regexp value $regexData6\n"
Run Code Online (Sandbox Code Playgroud)

我的puts声明正在返回:

Mar 31 
Run Code Online (Sandbox Code Playgroud)

我希望它只是返回:

31
Run Code Online (Sandbox Code Playgroud)

Jer*_*rry 5

你正在使用的正则表达式工作得很好,这只是我在评论中所说的语法问题:

regexp -all {(?:\w{3}\s)(\d{1,2})(?:\s)} $sData6 -> regexData6 
puts "Printing regexp value $regexData6\n"
Run Code Online (Sandbox Code Playgroud)

语法是:

regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?
Run Code Online (Sandbox Code Playgroud)

手册页

你使用的是matchVar,包含完整的匹配.subMatchVar包含第一个捕获的组,以及您需要的组.

我正在保存matchVarin ->(几乎任何变量名都可以在这里使用,因为我不需要它,我不需要有意义的东西).


FWIW,您可以使用这个较短的正则表达式来实现相同的结果:

regexp -all {\w{3}\s(\d{1,2})\s} $sData6 -> regexData6 
Run Code Online (Sandbox Code Playgroud)