Строковый диапазон прямого и обратного просмотра

Я пытаюсь написать скрипт, который получает ввод от пользователя и возвращает ввод в отформатированной области. Я использовал функцию 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 слов incididunt строки 2 были обрезаны. Я ищу способ найти ближайшее место к этому месту. Таким образом, для строки 1 это было бы до a, а для строки 2 это было бы до i. …В некоторых случаях это может быть после слова.

Ясно, что я ищу? Любая помощь будет здорово!


person CK1    schedule 13.05.2013    source источник


Ответы (2)


Операция 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.

Реализация полного выравнивания путем вставки пробелов оставлена ​​читателю в качестве упражнения (потому что это действительно намного сложнее, чем жадное разбиение строк!)

person Donal Fellows    schedule 13.05.2013
comment
Обратная косая черта во входном образце текста предназначена только для того, чтобы уменьшить количество прокрутки. - person Donal Fellows; 13.05.2013

Модуль textutil::adjust в tcllib - это то, что вам нужно:

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
person glenn jackman    schedule 13.05.2013