regsub 不能正常使用字符串 tolower

regsub not working properly with string tolower

我正在尝试将该模式的第一个字母设为小写。

 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 ""]}]
"[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

但是这里不行,因为需要匹配整个单词,全部通过转换命令传递;对单词的剩余部分使用前瞻约束允许在内部搜索匹配项时匹配这些剩余部分。