繁体   English   中英

REGEXP非捕获组正在捕获TCL

[英]REGEXP Non Capturing Group is Capturing with 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

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

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

语法是:

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

手册页

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

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


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM