正则表达式在两个标签之间提取数据

时间:2014-04-02 15:22:09

标签: regex tcl

我有一个文件svn_log.txt,其中包含以下数据:

:SUMMARY: This module is test created
:TIME: the current time is not listed

我正在使用tcl和regex从此文件中提取摘要。

set svn_logs svn_logs.txt
set fp [open $svn_logs r]
set lines [split [read -nonewline $fp] "\n"]
close $fp
foreach line $lines {
    if {[regexp -nocase {^\s*(:SUMMARY)\s*:\s*(.*)$} $line match tag value]} {
        set [string tolower $tag] $value
    }
}
puts $value

直到摘要只有一行才能正常工作。但有些情况下摘要有要点:

:SUMMARY: Following changes needs to be added
1. this one
2. this one too
:TIME:

在这种情况下,它不会提取除第一行以外的任何内容。我很难尝试修改上面的正则表达式命令,以便在:SUMMARY:TIME之间进行任何操作。正则表达式的新手。任何人都可以提供任何意见吗?

文件的原始内容 - >

------------------------------------------------------------------------
r743 | aaddh | 2014-04-01 12:33:42 -0500 (Tue, 01 Apr 2014) | 8 lines

:SUMMARY: Modified file to add following changes:
1.Loop to avoid . 
2.Change directory 
3.The batch file
:TIME: Invalid
:Test:
:Comments:

3 个答案:

答案 0 :(得分:2)

如果您真的想使用正则表达式,则必须使用不同的方法。您将不得不一次阅读整个文件并使用正则表达式:

set svn_logs svn_logs.txt
set fp [open $svn_logs r]
set lines [read -nonewline $fp]
close $fp
regexp -nocase -lineanchor -- {^\s*(:SUMMARY)\s*:\s*(.*?):TIME:$} $lines match tag value
puts $value

输入:

:SUMMARY: Following changes needs to be added
1. this one
2. this one too
:TIME:

你得到:

Following changes needs to be added
1. this one
2. this one too

codepad demo

-lineanchor标记使^匹配所有行的开头,$匹配所有行的结尾。 --只是确保没有额外的标志。

注意:在捕获的组的末尾有一个延迟的换行符,您可以根据需要修剪它。

答案 1 :(得分:1)

正则表达式解决方案非常紧凑。如果您正在阅读文件的行,您可以这样做:

set fh [open file r]
set insumm false
while {[gets $fh line] != -1} {
    switch -regex -- $line {
        {^:SUMMARY:} {set insumm true; set summary [string range $line 10 end]} 
        {^:\w+:} break
        default {if {$insumm} {append summary \n $line}}
    }
}
close $fh

答案 2 :(得分:-1)

您可以尝试以下内容:[^:SUMMARY:](.*)[^:TIME:]