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
激励 ullamco 劳动

正如您在第 1adipisicing行看到的那样,第 2 行的incididunt单词已被截断。我正在寻找一种方法来寻找离该位置最近的空间。所以对于第 1 行,它会a在第 2 行之前,它会在i. …在某些情况下,它可能在单词之后。

这清楚我在找什么吗?任何帮助都会很棒!

4

2 回答 2

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
ut laboure et dolore magna 事件
阿里夸 Ut enim ad minim veniam, quis
nostrud 锻炼 ullamco 劳力。

通过插入空格来实现完全对齐留给读者作为练习(因为它真的比贪婪的线分割要困难得多!)

于 2013-05-13T00:56:32.277 回答
1

tcllib 中的textutil::adjust模块就是您所需要的:

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
于 2013-05-13T00:58:35.100 回答