2012-09-08 89 views
1

您能否帮我将一个字符串拆分为一个空格作为分隔符?使用“\ n \ n”分割的 似乎不起作用。 这样的字符串的一个例子如下:Tcl:如何将空字符串分割为字符串

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) 
+0

谢谢Rishi,但是设置了group_source [regexp -inline -all {^ $} $ itext];这里空白不代表任何内容,因为'^ $',(start-end) –

+0

;似乎没有工作 – user690182

回答

2

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

+0

谢谢owlstead,但我需要一个列表,其中每个元素是“组:”之间的字符串,并包括与“评分:” – user690182

+0

行这样,当你插入这个正则表达式在你的'拆分法? –

+0

proc get_mroute_active {itext} {012 \\ s \ $ *} $ itext]]; foreach record $ group_source { puts“--->”; 放$ record; } } – user690182

0

Tcllib使用textutil包,你可以这样做:

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

textutil::splitx拆分一个字符串中使用正则表达式,在这里我们提供哪一个 - 或 - 序列匹配的正则表达式更多视觉空白的线条。 (该(?n)意味着^比赛线路开始,而不是其通常的字符串开始之意;这正是我们想在这里。)

+0

感谢敦尔,但该脚本将在运行思科路由器,不幸的是我没有使用textutil的奢侈品: – user690182

+0

@ user690182,什么版本的Tcl?'info patchlevel' –

+1

textutil是纯粹的Tcl,所以只需复制代码 – schlenk

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,如果顺序很重要。