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

时间:2012-09-08 13:06:27

标签: regex 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)

3 个答案:

答案 0 :(得分:2)

您可以使用正则表达式^\s*$来匹配仅包含零到N个空格的所有行。通常^和$匹配行的开始和结束,除非MULTILINE模式处于活动状态。

答案 1 :(得分:1)

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 "(.*)\n\n(.*)" $mystring match part1 part2]} {
    lappend mylist $part2
    set mystring $part1
}
lappend mylist $part1

mylist现在按相反顺序保存每组3个非空行 。可能有一些非贪婪的正则表达式会使它按顺序排列,但我现在无法弄明白。如果订单很重要,可以稍后将列表反转,或将lappend行替换为set

答案 2 :(得分:0)

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

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

textutil::splitx用正则表达式分割字符串,这里我们提供一个正则表达式,它匹配一个或多个视觉空白行的序列。 ((?n)表示^匹配line-start而不是通常的字符串开头含义;这正是我们想要的。)