2014-02-26 41 views
0

我有一個字符串如下解析字符串中的所有比賽在TCL

set temp " 
temp : value 
temp1 : value1 
tempvalue 
abc = 23:445:726 
abcdef = 456::985 
abcdef = 123:45:7 
abcdef = 098:45:56:8 
" 

在此我想要的輸出,其中值之後「=」應該被設置爲一個變量。輸出應該是

"456::985 123:45:7 098:45:56:8". 

我用

set result [regexp "abcdef\\s*=\\s*(\\S*)" $temp match v1] 

,但沒能獲得所有

我有使用正則表達式與-inline -all和直插式的答案,將結果存儲在列表,然後遍歷它來獲取值。我需要一個襯墊

set result [regexp -inline -all -line "abcdef\\s*=\\s*(\\S*)" $temp] 

輸出是

{abcdef = 456::985} 456::985 {abcdef = 123:45:7} 123:45:7 {abcdef = 098:45:56:8} 098:45:56:8 

然後通過這個遍歷設置它們都在同一個字符串。但我想知道是否有任何簡單的方法來做到這一點。 在此先感謝。

回答

1

鑑於這個例子,你不需要regexp。將線條拆分成小塊並創建一個新列表。

set r {} 
foreach line [split $temp \n] { 
    if {[string trim $line] eq ""} continue;    # skip blank lines 
    lappend r [string trim [lindex [split $line =] end]] 
} 
puts $r 

這將給出一個列表,只有等號後面的位。如果你把它當作一個字符串來處理,那麼它就像一個字符串一樣工作,每個元素都被一個空格分開。

0

由於您使用的面向線路的匹配,利用線錨:

% regexp -inline -all -line {\S+$} $temp 
456::985 123:45:7 098:45:56:8 

因此,將值保存爲字符串

set values [join [regexp -inline -all -line {\S+$} $temp]] 

如果有可能不等於後空格,使用模式{[^=\s]+$}

我的整個答案都假設每個lin只會有一個等號即


響應於更新的樣本輸入:

foreach {m word} [regexp -inline -all -line {=\s*(\S+)$} $temp] { 
    lappend words $word 
} 
puts [join $words] 
23:445:726 456::985 123:45:7 098:45:56:8 
+0

感謝您的回答。但在我的情況下,我會有一些由「:」分隔的情況,這也是結果。你能不能使用「-line」選項給我一個建議。通過在python中使用正則表達式的反向引用 – Myjab

+0

如果您要更改需求,則必須更新您的問題以提供更好的示例。 –

+0

我已修改它,你可以請現在檢查 – Myjab

0

下面是另一種方法:認爲每一行的作爲3個標記:鍵,等號,和值:

set result {} 
foreach {key eq_sign value} $temp { lappend result $value } 

這種方法很容易理解,但如果值包含空間。