Regsub не работает должным образом со строкой Tolower
Я пытаюсь сделать первую букву этого шаблона строчными.
set filestr {"FooBar": "HelloWorld",}
regsub -all {([A-Z])([A-Za-z]+":)} $filestr "[string tolower "\\1"]\\2" newStr
Тем не менее, строка tolower ничего не делает
2 ответа
Это двухэтапный процесс в Tcl:
set tmp [regsub -all {([A-Z])([A-Za-z]+":)} $filestr {[string tolower "\1"]\2}]
"[string tolower "F"]ooBar": "HelloWorld",
Здесь мы добавили синтаксис для нижнего регистра буквы. Обратите внимание, как я использовал не интерполяционные скобки вместо двойных кавычек для запасной части. Теперь мы применяем subst
Команда для фактического применения команды:
set newStr [subst $tmp]
"fooBar": "HelloWorld",
В Tcl 8.7 вы можете сделать это за один шаг с новой возможностью подстановки команд: regsub
:
set filestr {"FooBar": "HelloWorld",}
# The backslash in the RE is just to make the highlighting here not suck
regsub -all -command {([A-Z])([A-Za-z]+\":)} $filestr {apply {{- a b} {
string cat [string tolower $a] $b
}}} newStr
Если бы вы хотели преобразовать все слово в нижний регистр, вы могли бы использовать эту более простую версию:
regsub -all -command {[A-Z][A-Za-z]+(?=\":)} $filestr {string tolower} newStr
Но здесь это не работает, потому что вам нужно сопоставить все слово и передать все это через команду преобразования; использование ограничений на предпросмотр для остатков слова позволяет сопоставить эти остатки при внутреннем поиске совпадения.