使用TCL拆分camelcase值

使用TCL拆分camelcase值,tcl,Tcl,我有一个TCL表达式: [string toupper [join [lrange [file split [value [topnode].file]] 1 1]]] 这将从c:/companyName…中检索companyName值,我需要将第一个大写字母之前的值拆分为公司名称。有什么想法吗 提前感谢。首先,请尝试使用 lindex [file split [value [topnode].file]] 1 lrange命令将返回一个列表,这可能会导致某些目录名出现问题。如果不使用lra

我有一个TCL表达式:

[string toupper [join [lrange [file split [value [topnode].file]] 1 1]]]
这将从
c:/companyName…
中检索
companyName
值,我需要将第一个大写字母之前的值拆分为
公司名称
。有什么想法吗


提前感谢。

首先,请尝试使用

lindex [file split [value [topnode].file]] 1
lrange
命令将返回一个列表,这可能会导致某些目录名出现问题。如果不使用
lrange
,并且
string-toupper
会删除执行所需操作所需的信息,那么
join
命令应该是毫无意义的

要在大写字母之前拆分,可以使用重复匹配的
(?:[a-z]+|[a-z][a-z]+)
(仅限ASCII/英文字母)或
(?:[:lower:]+[:upper:][:lower:]+)
(任何Unicode字母)

使用
string totitle
将第一个单词的第一个字母改为大写

文件: , , , ,
首先,尝试使用

lindex [file split [value [topnode].file]] 1
lrange
命令将返回一个列表,这可能会导致某些目录名出现问题。如果不使用
lrange
,并且
string-toupper
会删除执行所需操作所需的信息,那么
join
命令应该是毫无意义的

要在大写字母之前拆分,可以使用重复匹配的
(?:[a-z]+|[a-z][a-z]+)
(仅限ASCII/英文字母)或
(?:[:lower:]+[:upper:][:lower:]+)
(任何Unicode字母)

使用
string totitle
将第一个单词的第一个字母改为大写

文件: , , , ,
这个词比我认为的好得多。这使整个事情变得非常不透明!让我们把它分开

首先,我希望使用
lindex
从拆分文件名中更好地检索基本公司名称

set companyName [lindex [file split [value [topnode].file]] 1]
现在,我们需要对其进行处理,以获得人类可读的版本。唉,在不知道对它做了什么的情况下,这会有点困难,但如果我们以
fooBarBoo\u grill
为例,那么我们可以看看我们能做些什么。首先,我们使用一些正则表达式获取片段(如果涉及非ASCII字符,或者如果某些关键字符需要特殊处理,则可能需要调整此部分):

接下来,我们需要资本化。我假设您使用的是Tcl 8.6,因此有
lmap
,因为它非常适合此任务。
string-totitle
命令已经存在很长时间了

set pieces [lmap word $pieces {string totitle $word}]
# pieces = Foo Bar Boo Grill
该列表可能需要更多的调整,或者它可能还可以。例如,如果你有一个爱尔兰名字,比如
O'Hanrahan
,或者如果你需要在
Inc
之前和之后插入逗号,可能需要进行调整

最后,我们应该正确地设置companyName[join$pieces]以返回一个真正的字符串,但是对于一个纯粹由字母组成的单词列表,这并没有明显的效果。此外,如果插入了前缀标点符号(如
,Inc.
案例),则可能需要更复杂的正则表达式连接



如果我真的这么做,我会尝试在其他地方直接表达正确的公司名称,而不是依赖文件名。做对更简单 首先,我希望使用
lindex
从拆分文件名中更好地检索基本公司名称

set companyName [lindex [file split [value [topnode].file]] 1]
现在,我们需要对其进行处理,以获得人类可读的版本。唉,在不知道对它做了什么的情况下,这会有点困难,但如果我们以
fooBarBoo\u grill
为例,那么我们可以看看我们能做些什么。首先,我们使用一些正则表达式获取片段(如果涉及非ASCII字符,或者如果某些关键字符需要特殊处理,则可能需要调整此部分):

接下来,我们需要资本化。我假设您使用的是Tcl 8.6,因此有
lmap
,因为它非常适合此任务。
string-totitle
命令已经存在很长时间了

set pieces [lmap word $pieces {string totitle $word}]
# pieces = Foo Bar Boo Grill
该列表可能需要更多的调整,或者它可能还可以。例如,如果你有一个爱尔兰名字,比如
O'Hanrahan
,或者如果你需要在
Inc
之前和之后插入逗号,可能需要进行调整

最后,我们应该正确地设置companyName[join$pieces]以返回一个真正的字符串,但是对于一个纯粹由字母组成的单词列表,这并没有明显的效果。此外,如果插入了前缀标点符号(如
,Inc.
案例),则可能需要更复杂的正则表达式连接



如果我真的这么做,我会尝试在其他地方直接表达正确的公司名称,而不是依赖文件名。做对更简单

谢谢多纳尔和彼得!最后我在一行中使用了这样的表达式,工作起来很有魅力:
[string toupper[regexp-all-inline{[a-z]+[a-z][a-z]*}[lindex[file split[value[topnode].file]]1]]
我仍然在使用
toupper
,因为我需要将最终结果全部大写。再次感谢。谢谢多纳尔和彼得!最后我在一行中使用了这样的表达式,工作起来很有魅力:
[string toupper[regexp-all-inline{[a-z]+[a-z][a-z]*}[lindex[file split[value[topnode].file]]1]]
我仍然在使用
toupper
,因为我需要将最终结果全部大写。再次感谢。