Строка Диапазон вперед и назад, взгляд вокруг
Я пытаюсь написать скрипт, который получает ввод от пользователя и возвращает ввод в отформатированной области. Я использовал string range
Функция, однако, очевидно, сокращает вход в диапазоне, который я даю. Можно ли как-нибудь осмотреть указанный диапазон, чтобы найти следующий пробел и обрезать ввод в этом месте?
Например, если у меня есть ввод:
Lorem Ipsum Dolor Sit Amet, Concetetur Adipisicing Elit, Sed Do EiusMod Tempor Incididunt U Labore et Dolore Magna Aliqua. Ut Enim Ad Minim Veniam, Quis Nostrud упражнение Ullamco Labouris
Мой текущий string range
функция форматирует ввод с \r\n
в качестве таких:
Lorem Ipsum Dolor Sit Amet, концерт elit, sed do eiusmod tempor в cididunt ut labore et dolore magna aliqua, Ut enim ad minim veniam, quis nostrud exercitation ullamco labour
Как вы можете видеть в строке 1, adipisicing
строка 2 incididunt
слова были обрезаны. Я ищу способ найти ближайшее место к этому месту. Так что для строки 1 это было бы до a
на линии 2 это было бы до i
,... В некоторых случаях это может быть после слова.
Это ясно, что я ищу? Любая помощь будет отличной!
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"]
Это производит этот вывод для меня:
Лорем Ипсум Долор Сит Амет, Концертур elip, sed do eiusmod tempor Инцидент ут Лабор и Долоре Магна aliqua. Ut enim ad minim veniam, quis Нострудная тренировка.
Внедрение полного выравнивания путем вставки пробелов оставлено читателю как упражнение (потому что это действительно намного сложнее, чем жадное разбиение строки!)
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