REGEX非捕获组正在捕获TCL

时间:2015-04-02 09:23:06

标签: 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

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

(?:\w{3}\s)(\d{1,2})(?:\s)

我在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"

我的puts语句正在返回:

Mar 31 

我想要回报:

31

1 个答案:

答案 0 :(得分:5)

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

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

语法为:

regexp ?switches? exp string ?matchVar? ?subMatchVar subMatchVar ...?

manpage

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

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


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

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