В Tcl 8.7 самый канонический способ сделать это - использовать regsub
с параметром -command
, чтобы применить string totitle
к подстрокам, которые вы хотите изменить:
set str "hello world"
# Very simple RE: (greedy) sequence of word characters
set tcstr [regsub -all -command {\w+} $str {string totitle}]
puts $tcstr
В в более ранних версиях Tcl у вас нет этой опции, поэтому вам понадобится двухэтапное преобразование:
set tcstr [subst [regsub -all {\w+} $str {[string totitle &]}]]
Проблема в том, что оно будет ниже, если входная строка содержит определенные метасимволы Tcl; это это возможно исправить, но это ужасно; Я добавил параметр -command
к regsub
именно потому, что мне надоело выполнять многоступенчатую замену только для того, чтобы создать строку, которую я мог бы пропустить через subst
. Вот безопасная версия (этап ввода также может быть выполнен с помощью string map
):
set tcstr [subst [regsub -all {\w+} [regsub -all {[][$\\]} $str {\\&}] {[string totitle &]}]]
Это становится действительно сложным (ну, по крайней мере, совершенно неочевидным), когда вы действительно хотите выполнить замену на подстроки, которые были преобразованы. Вот почему теперь можно обойти весь этот беспорядок с помощью regsub -command
, который осторожен с границами слов при выполнении команды замены (потому что API Tcl C действительно хорош в этом).