regsub与字符串tolower无法正常工作

时间:2017-11-28 23:46:15

标签: string tcl regsub

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

 set filestr {"FooBar": "HelloWorld",}
 regsub -all {([A-Z])([A-Za-z]+":)} $filestr "[string tolower "\\1"]\\2" newStr

然而,字符串tolower没有做任何事情

2 个答案:

答案 0 :(得分: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",

答案 1 :(得分:1)

在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

但它在这里不起作用,因为你需要匹配整个单词并通过转换命令传递它;使用前瞻约束来保留单词的剩余部分允许在内部搜索匹配时保留这些遗骸。