我试图使该模式的第一个字母小写。
set filestr {"FooBar": "HelloWorld",}
regsub -all {([A-Z])([A-Za-z]+":)} $filestr "[string tolower "\\1"]\\2" newStr
但是字符串 tolower 没有做任何事情
这是 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
但这在这里不起作用,因为您需要匹配整个单词并通过转换命令将其全部传递;对单词的剩余部分使用前瞻约束允许在内部搜索匹配时匹配这些剩余部分。