1

你能帮我把一个字符串拆分成一个列表,用一个空行作为分隔符吗?使用 "\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)
4

3 回答 3

2

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

于 2012-09-08T13:24:04.960 回答
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

于 2012-09-09T23:24:47.157 回答
0

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

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

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

于 2012-09-08T15:15:07.477 回答