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

Но здесь это не работает, потому что вам нужно сопоставить все слово и передать все это через команду преобразования; использование ограничений на предпросмотр для остатков слова позволяет сопоставить эти остатки при внутреннем поиске совпадения.

Другие вопросы по тегам