Могу ли я преобразовать строку с пробелом с помощью totitle? - PullRequest
1 голос
/ 07 мая 2020

В документации Tcl ясно, как использовать string totitle:

Возвращает значение, равное string , за исключением того, что первый символ в строка преобразуется в вариант с регистром заголовка Unicode (или в верхний регистр, если нет варианта с регистром заголовка) , а остальная часть строки преобразуется в нижний регистр .

Есть ли обходной путь или метод, который преобразует строку с пробелами (первая буква каждого слова будет в верхнем регистре)?

Например, в Python:

intro : str = "hello world".title()
print(intro) # Will print Hello World, notice the capital H and W. 

Ответы [ 2 ]

3 голосов
/ 07 мая 2020

В 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 действительно хорош в этом).

0 голосов
/ 08 мая 2020

Донал дал вам ответ, но есть пакет, который позволяет вам делать то, что вы хотите textutil :: string из Tcllib

package require textutil::string
puts [::textutil::string::capEachWord "hello world"] 
> Hello World
...