[英]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.