字符串范围向前和向后的环视

时间:2013-05-13 00:42:19

标签: string range tcl lookaround

我正在尝试编写一个从用户获取输入并在格式化区域中返回输入的脚本。我一直在使用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之前。 ......在某些情况下,它可能在这个词之后。

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

2 个答案:

答案 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)

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