Tcl 如何转换第一个字母为大写,其余字母为小写的字符串。

Tcl 如何转换第一个字母为大写,其余字母为小写的字符串。,tcl,uppercase,lowercase,Tcl,Uppercase,Lowercase,例如,我有一句话:你的门牌号是多少?是26号吗。我必须把每个单词的前几个字母都转换成大写,其余的都转换成小写。我想使用所有的lsearch、lindex lreplace和其他东西来形成代码。有人能告诉我怎么做吗 您可以使用Initcap函数以大写形式生成第一个字母,其余字母以小写形式生成。您可以使用Initcap函数以大写形式生成第一个字母,其余字母以小写形式生成。命令关闭:除第一个字符为大写外,它将整个字符串小写 set s {whAT is yOur hoUSe nUmBer ? Is i

例如,我有一句话:你的门牌号是多少?是26号吗。我必须把每个单词的前几个字母都转换成大写,其余的都转换成小写。我想使用所有的lsearch、lindex lreplace和其他东西来形成代码。有人能告诉我怎么做吗

您可以使用Initcap函数以大写形式生成第一个字母,其余字母以小写形式生成。

您可以使用Initcap函数以大写形式生成第一个字母,其余字母以小写形式生成。

命令关闭:除第一个字符为大写外,它将整个字符串小写

set s {whAT is yOur hoUSe nUmBer ? Is iT 26.}
string totitle $s
每一个单词都要大写一点:

proc CapitalizeEachWord {sentence} {
    subst -nobackslashes -novariables [regsub -all {\S+} $sentence {[string totitle &]}]
}
set s {whAT is yOur hoUSe nUmBer ? Is iT 26.}
CapitalizeEachWord $s
regsub命令接受每个空格分隔的单词,并将其替换为文字字符串[string totitle word]:

我们使用该命令计算所有单个字符串totitle命令

Tcl 8.7面世后,我们将能够做到:

proc CapitalizeEachWord {sentence} {
   regsub -all -command {\S+} $sentence {string totitle}
}
该命令是close:它将整个字符串小写,但第一个字符是大写的

set s {whAT is yOur hoUSe nUmBer ? Is iT 26.}
string totitle $s
每一个单词都要大写一点:

proc CapitalizeEachWord {sentence} {
    subst -nobackslashes -novariables [regsub -all {\S+} $sentence {[string totitle &]}]
}
set s {whAT is yOur hoUSe nUmBer ? Is iT 26.}
CapitalizeEachWord $s
regsub命令接受每个空格分隔的单词,并将其替换为文字字符串[string totitle word]:

我们使用该命令计算所有单个字符串totitle命令

Tcl 8.7面世后,我们将能够做到:

proc CapitalizeEachWord {sentence} {
   regsub -all -command {\S+} $sentence {string totitle}
}

8.6及之前版本中用于将命令应用于字符串的一组正则表达式选择子字符串的常用模型如下:

subst[regsub-all$retof子字符串[MakeSafe$input]{[TheCommandToApply&]] 之所以需要MakeSafe,是因为subst不仅仅执行您想要的位。即使禁用了一些替换类,例如使用-novariables选项,您仍然需要所有替换中最棘手的一个-命令替换-这意味着像hello[pwd]bye这样的字符串可能会让您大吃一惊。要解决这个问题,您可以将字符串“安全”地替换为每个Tcl元字符,或者至少将subst中重要的字符替换为反斜杠版本。下面是一个经典版本的MakeSafe,您经常会看到它的内联:

proc MakeSafe{inputString}{ regsub-所有{[][$\{}]}$inputString{\\&} } 以交互方式演示它:

%MakeSafe{你好,再见} 你好\[pwd\]再见 在该版本中,subst中不需要关闭任何替换类,尽管您可以关闭变量,并且当您应用该命令时,不会出现意外情况,因为替换参数字符串中可能出现的内容已被转义。但是有一个很大的缺点:您可能需要在转换中更改正则表达式,以考虑到现在存在的额外反斜杠。问题的RE不需要它,因为它只选择单词字符序列,事实上,它可以安全地简化为以下版本:

subst[regsub-all{\w+}[regsub-all{[][\\$]}$input{\\&}]{[string totitle&]}] 在8.7以后的版本中,regsub有一个-command选项,可以避免所有这些混乱。它的速度也相当快,因为subst通过将其转换编译成字节码来工作,这对于一次性替换来说不是一个好的胜利!而regsub命令使用直接命令调用,速度更快

regsub-all-command{\w+}$input{string totitle} regsub-all-命令使用的内部方法可以在8.6或更早版本中使用更多的额外垫片进行模拟,但这并非微不足道:

proc regsubAllCommand{RE input command}{ 为了使代码更短,我假设RE中没有子表达式 设置索引[regexp-all-inline-index-$RE$input] 首先收集替换人员,使状态正确 设置替换[lmap indexPair$索引{ 安全版本:uplevel$命令[字符串范围$input{*}$indexPair] uplevel 1[列表{*}$命令[字符串范围$input{*}$indexPair]] }] 按相反顺序应用替换项 设置输出$input foreach indexPair[lreverse$指数]替换[lreverse$替换]{ 设置输出[string replace$output{*}$indexPair$replacement] } 返回$output }
regsub的C实现在内部使用工作缓冲区等,但这在Tcl级别并不太方便。

8.6及之前版本中,将命令应用于字符串的一组正则表达式选择子字符串的常用模型如下:

subst[regsub-all$retof子字符串[MakeSafe$input]{[TheCommandToApply&]] 之所以需要MakeSafe,是因为subst不仅仅执行您想要的位。即使禁用了一些替换类,例如使用-novariables选项,您仍然需要所有替换中最棘手的一个-命令替换-这意味着像hello[pwd]bye这样的字符串可能会让您大吃一惊。要解决这个问题,您可以通过替换每个Tcl元字符或至少替换subst中重要的字符来使字符串“安全” 通过它的反斜杠版本。下面是一个经典版本的MakeSafe,您经常会看到它的内联:

proc MakeSafe{inputString}{ regsub-所有{[][$\{}]}$inputString{\\&} } 以交互方式演示它:

%MakeSafe{你好,再见} 你好\[pwd\]再见 在该版本中,subst中不需要关闭任何替换类,尽管您可以关闭变量,并且当您应用该命令时,不会出现意外情况,因为替换参数字符串中可能出现的内容已被转义。但是有一个很大的缺点:您可能需要在转换中更改正则表达式,以考虑到现在存在的额外反斜杠。问题的RE不需要它,因为它只选择单词字符序列,事实上,它可以安全地简化为以下版本:

subst[regsub-all{\w+}[regsub-all{[][\\$]}$input{\\&}]{[string totitle&]}] 在8.7以后的版本中,regsub有一个-command选项,可以避免所有这些混乱。它的速度也相当快,因为subst通过将其转换编译成字节码来工作,这对于一次性替换来说不是一个好的胜利!而regsub命令使用直接命令调用,速度更快

regsub-all-command{\w+}$input{string totitle} regsub-all-命令使用的内部方法可以在8.6或更早版本中使用更多的额外垫片进行模拟,但这并非微不足道:

proc regsubAllCommand{RE input command}{ 为了使代码更短,我假设RE中没有子表达式 设置索引[regexp-all-inline-index-$RE$input] 首先收集替换人员,使状态正确 设置替换[lmap indexPair$索引{ 安全版本:uplevel$命令[字符串范围$input{*}$indexPair] uplevel 1[列表{*}$命令[字符串范围$input{*}$indexPair]] }] 按相反顺序应用替换项 设置输出$input foreach indexPair[lreverse$指数]替换[lreverse$替换]{ 设置输出[string replace$output{*}$indexPair$replacement] } 返回$output }
regsub的C实现在内部使用工作缓冲区等,但在Tcl级别上这不是很方便。

我在交互会话Tcl 8.5.10中使用Initcap fooBar,并获得无效的命令名Initcap,那么你在说什么?抱歉,我不熟悉Initcap函数。我在交互会话Tcl 8.5.10中执行Initcap fooBar,得到无效的命令名Initcap,那么你在说什么呢?抱歉,我不熟悉Initcap函数。一般来说,需要做更多的工作才能去除输入字符串中任何散乱的Tcl元字符,但这是一种合理的方法。@DonalFellows::你能举一个不被-nobackslashes-novariables选项破坏的元字符的例子吗,或者是一个有问题的字符串?这里有一个例子:设置句子{hello[pwd]world},然后大写每个单词$句子生成hello/users/glennjackman WorldSo,因为我们使用subst来做命令子基,所以我们需要在原始句子中转义任何开括号:regsub-all{\[}$sential@jimbobmcgee很难在你的头脑中计算出这类东西的安全属性。这就是为什么我如此期待8.7解决方案成为官方推荐;显示它的安全性是微不足道的。一般来说,需要多做一点工作,才能去除输入字符串中任何游离的Tcl元字符,但这是一个错误一种合理的方法。@DonalFellows::你能给出一个没有被-nobackslashes-novariables选项损坏的元字符的例子,或者一个有问题的字符串吗?这里有一个例子:设置句子{hello[pwd]world}然后capitalizeAchWord$句子生成Hello/users/glennjackman WorldSo,因为我们使用subst来执行命令子位置,所以需要转义原始句子中的任何开括号:regsub-all{\[}$句子{\\&}@jimbobmcgee很难在你的头脑中计算出这类东西的安全属性。这就是为什么我如此期待8.7解决方案成为官方推荐;显示它的安全性是微不足道的。现在你可以确切地看到为什么添加了-command选项。这对于一个评论来说太长了!谢谢你的建议。我明白了我在-nobackslashes-novariables之前所做的事情上投入了太多的资金。现在你可以确切地看到为什么添加了-command选项。这对于评论来说太长了!谢谢你。我可以看到我在-nobackslashes-novariables之前所做的事情上投入了太多的资金。