我正在尝试编写一个从用户获取输入并在格式化区域中返回输入的脚本。我一直在使用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
之前。 ......在某些情况下,它可能在这个词之后。
这是否清楚我在寻找什么?任何帮助都会很棒!
答案 0 :(得分: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.
通过插入空格来实现完全对齐是留给读者的练习(因为它实际上比贪婪的线分裂要困难得多!)
答案 1 :(得分:1)
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