我有数据,见下文,我想在我的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
答案 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 ...?
您使用的是matchVar
,其中包含完整匹配。 subMatchVar
包含第一个捕获的组,以及您需要的组。
我将matchVar
保存在->
中(几乎任何变量名都可以在这里使用,因为我不需要它,我不需要有意义的东西)。
FWIW,您可以使用这个较短的正则表达式来实现相同的结果:
regexp -all {\w{3}\s(\d{1,2})\s} $sData6 -> regexData6