Tcl:如何用空行分割字符串



你能帮我用空行作为分隔符将字符串拆分成列表吗?使用"\n\n"拆分似乎不起作用。这样一个字符串的例子如下:

Group: 1.1.1.1, (?)
   Source: 2.2.2.2 (?)
     Rate: 5382 pps/58470 kbps(1sec), 58469 kbps(last 30 secs), 58327 kbps(life avg)
Group: 3.3.3.3, (?)
   Source: 4.4.4.4 (?)
     Rate: 9150 pps/99399 kbps(1sec), 99398 kbps(last 30 secs), 85769 kbps(life avg)
Group: 5.5.5.5, (?)
   Source: 6.6.6.6 (?)
     Rate: 474 pps/5163 kbps(1sec), 5164 kbps(last 30 secs), 5144 kbps(life avg)

您可以使用正则表达式^s*$来匹配所有只包含0到N个空白的行。通常,^和$匹配行首和行尾,除非MULTILINE模式处于活动状态。

set mystring {Group: 1.1.1.1, (?)
    Source: 2.2.2.2 (?)
      Rate: 5382 pps/58470 kbps(1sec), 58469 kbps(last 30 secs), 58327 kbps(life avg)
Group: 3.3.3.3, (?)
    Source: 4.4.4.4 (?)
      Rate: 9150 pps/99399 kbps(1sec), 99398 kbps(last 30 secs), 85769 kbps(life avg)
Group: 5.5.5.5, (?)
    Source: 6.6.6.6 (?)
      Rate: 474 pps/5163 kbps(1sec), 5164 kbps(last 30 secs), 5144 kbps(life avg)}
set mylist {}
while {[regexp "(.*)nn(.*)" $mystring match part1 part2]} {
    lappend mylist $part2
    set mystring $part1
}
lappend mylist $part1

mylist现在以相反的顺序保持每3组非空白行。可能有一些不贪婪的正则表达式会把它整理好,但我现在还想不出来。如果顺序很重要,可以稍后反转列表,或者用set替换lappend行。

使用Tcllib的textutil包,您可以执行以下操作:

package require textutil
set paragraphs [textutil::splitx $data {(?n)^s*n}]

textutil::splitx通过正则表达式将字符串拆分,这里我们提供了一个正则表达式,它匹配一个或多个视觉空白行的序列。((?n)意味着^匹配行开始,而不是它通常的字符串开始含义;这正是我们在这里想要的。)

最新更新