在tcl中捕获文件中的多个空行

时间:2015-06-24 12:35:39

标签: tcl

我的文件中有4个空格,在wr_fp中设置。我希望在代码中捕获四个空格。但是下面的代码不起作用。

while {[gets $wr_fp line3] >= 0} {
if {[regexp "\n\s+\n\s+\n\s+\n" $line3]} { puts "found 4 empty lines"}
}

3 个答案:

答案 0 :(得分:2)

tl; dr:请勿将RE置于"引号"中,将其放入{大括号}

问题是你把RE放在引号中,所以实际这个:


s+
s+
s+

由于Tcl general substitution rules\n成为新行,\s变为简单s。将RE置于括号中可以抑制此行为(在这种情况下不需要)行为。

答案 1 :(得分:0)

gets / chan gets命令一次读取一行并丢弃每行的换行符,因此您的测试永远不会成功。您需要立即读取文件的完整内容:

set txt [chan read $wr_fp]
if {[regexp {\n\s+\n\s+\n\s+\n} $txt]} { puts "found 4 empty lines"}

请注意,正如Donal所解释的那样,您需要在正则表达式周围使用大括号。

关于RE配方的一些典型缺陷:

  • 你真的打算指定每个空白字符必须至少有一个空白字符吗?线?如果您想允许换行符之间完全没有字符的行,请使用\s*代替\s+
  • 另请注意,此正则表达式将匹配具有四个以上换行符的范围:其中一个\s+组将使用额外的换行符。如果您想禁止使用其他换行符,请与(例如)[ \t\f\r](或您想要的任何其他空格组合)匹配,而不是\s。请注意,这意味着表达式将完全匹配三个行,只有空格,制表符,换页和返回,这些行被换行包围并分隔:您可能希望将其扩展为另外一个子组匹配第四行。

我在你自己的答案中描述的解决方案有点神秘,因为它没有做到问题中指定的内容。使用以下文本文件:

abc

def

ghi

jkl

mno

pqr




stu

vwx

yz.

(&#34后第二行中有一个制表符; pqr")

并且假设count在调用代码时值为0,则代码输出&#34;找到4个空格&#34;在&#34; def&#34;,&#34; pqr&#34;和&#34; vwx&#34;之后读取空白行,但<&#>> 之后的行#34 ; stu&#34;,你的问题表明它应该是。

此代码

set count 0
while {[gets $rd_fp line] >= 0} {
    if {[string is space $line]} {
        incr count
        if {$count == 4} {puts "found 4 space"} 
    } else {
        set count 0
    }
}

做你所要求的(几乎):它接受包含空格的行为空,并且只在找到四个连续的空行后才打印它的消息。与您的问题中的规范的主要区别在于它还接受没有任何字符为空的行。为符合您的规范,应改为使用string is space -strict $line

文档:changetsifincrputsregexpset,{{3 },string

答案 2 :(得分:0)

这是我的答案。我想要这个。

while {[gets $rd_fp line] >= 0} {
if {[string match "" $line]} {
if {[expr $count % 4] == 1} {puts "found 4 space"} 
incr count
}

}