REGEX 非捕获组正在使用 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 网站上用我的示例数据对其进行了测试,它似乎在那里可以正常工作;它 return 是组中的月份日期,但是当我 运行 它在我的 TCL 脚本中时,它 return 是所有匹配项,即非捕获组是 returned.
我在这里遗漏了什么吗?我不太擅长正则表达式。
谢谢。
编辑:
下面是我的脚本中的代码示例。我有一个正在读取的 CSV 文件,其中 sData6 列包含上面的 date/time 信息。
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"
我的看跌声明是 returning:
Mar 31
我只想要 return:
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
我有数据,见下文,我想在我的 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 网站上用我的示例数据对其进行了测试,它似乎在那里可以正常工作;它 return 是组中的月份日期,但是当我 运行 它在我的 TCL 脚本中时,它 return 是所有匹配项,即非捕获组是 returned.
我在这里遗漏了什么吗?我不太擅长正则表达式。
谢谢。
编辑:
下面是我的脚本中的代码示例。我有一个正在读取的 CSV 文件,其中 sData6 列包含上面的 date/time 信息。
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"
我的看跌声明是 returning:
Mar 31
我只想要 return:
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