【问题标题】:REGEXP Non Capturing Group is Capturing with TCLREGEX 非捕获组正在与 TCL 捕获
【发布时间】:2015-06-07 04:43:05
【问题描述】:

我有数据,见下文,我想在我的 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

【问题讨论】:

  • 能否请您输入您正在使用的代码?也许放一个示例代码来重现您遇到的问题?
  • @Jerry 我已经用我正在尝试做的示例更新了我的问题。
  • 好的,这只是语法问题。一会儿我会给出答案

标签: regex tcl


【解决方案1】:

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

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 

【讨论】:

  • 成功了,脚本现在可以正常工作了。由于我是新用户,因此无法投票支持您的答案。
  • @p_cos 不必担心对您提出的问题的答案进行投票; upvote 机制主要供 other 人使用。 (现在,它有两个赞成票,所以它工作得很好……)
猜你喜欢
  • 1970-01-01
  • 2019-03-08
  • 2013-12-04
  • 1970-01-01
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多