2013-05-13 76 views
1

我想寫一個腳本,獲取來自用戶的輸入並返回格式化區域中的輸入。我一直在使用string range函數,但它顯然會削減我給出的範圍內的輸入。有什麼方法可以在指定的範圍內查看下一個空格字符並切斷該位置的輸入嗎?字符串範圍向前和向後看周圍

舉例來說,如果我有輸入:

 
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris 

我現在string range功能與\r\n格式輸入這樣:

 
Lorem ipsum dolor sit amet, consectetur a 
dipisicing elit, sed do eiusmod tempor in 
cididunt ut labore et dolore magna aliqua 
. Ut enim ad minim veniam, quis nostrud e 
xercitation ullamco laboris 

正如你可以在第1行的adipisicing線看2 incididunt單詞已被切斷。我正在尋找一種方法來尋找距離該地點最近的空間。因此對於第1行,它應該在第2行的a之前,它會在i之前。 ......在某些情況下,它可能是在這個詞之後。

這是否清楚我在找什麼?任何援助將是偉大的!

回答

1

string range操作很愚蠢;它不知道它正在分割的字符串,除了它包含字符。爲了獲得更智能的分裂,你最好的選擇可能是一個明智選擇的正則表達式:

set s "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\ 
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis\ 
nostrud exercitation ullamco laboris." 

# Up to 40 characters, from word-start, to word-start or end-of-string 
set RE {\m.{1,40}(?:\m|\Z)} 
# Extract the split-up list of "lines" and print them as lines 
puts [join [regexp -all -inline $RE $s] "\n"] 

這產生這樣的輸出對我來說:

 
Lorem ipsum dolor sit amet, consectetur 
adipisicing elit, sed do eiusmod tempor 
incididunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam, quis 
nostrud exercitation ullamco laboris. 

通過插入空格實現充分的理由保留爲一個練習讀者(!因爲它真的比貪婪線分裂了不少困難)

+0

輸入示例文本中的反斜線僅只是爲了保持向下滾動的量。 – 2013-05-13 00:57:42

1

在tcllib The textutil::adjust module是你所需要的:

package require textutil::adjust 
set line "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris" 
set formatted [textutil::adjust::adjust $line -length 41] 
puts $formatted 
Lorem ipsum dolor sit amet, consectetur 
adipisicing elit, sed do eiusmod tempor 
incididunt ut labore et dolore magna 
aliqua. Ut enim ad minim veniam, quis 
nostrud exercitation ullamco laboris