我有这个TCL表达式:
[string toupper [join [lrange [file split [value [topnode].file]] 1 1]]]
这会从companyName
检索c:/companyName...
值,我需要将该值在第一个大写字母前分成Company Name
。有什么想法吗?
提前致谢。
答案 0 :(得分:2)
首先,尝试使用
lindex [file split [value [topnode].file]] 1
lrange
命令将返回一个列表,这可能会导致某些目录名称出现问题。如果您不使用join
,lrange
命令应毫无意义,而string toupper
会删除您要执行此操作所需的信息。
要在大写字母前拆分,您可以使用(?:[a-z]+|[A-Z][a-z]+)
(仅限ASCII /英文字母)或(?:[[:lower:]]+|[[:upper:]][[:lower:]]+)
(任何Unicode字母)的重复匹配。
% regexp -all -inline {(?:[a-z]+|[A-Z][a-z]+)} camelCaseWord
camel Case Word
使用string totitle
将第一个单词的第一个字母更改为大写。
文档: file, lindex, regexp, string, Syntax of Tcl regular expressions
答案 1 :(得分:2)
这比我认为好主意更能说明一句话。它使整个事情变得非常不透明!让我们分开吧。
首先,我希望从分割文件名中使用lindex
更好地检索基本公司名称。
set companyName [lindex [file split [value [topnode].file]] 1]
现在,我们需要处理它以获取人类可读的版本。唉,如果不知道对它做了什么,那将会有点困难,但如果我们以fooBarBoo_grill
为例,那么我们可以看到我们能做些什么。首先,我们得到带有一些正则表达式的部分(如果涉及非ASCII字符,或者如果某些关键字符需要特殊处理,则此部分可能需要调整):
# set companyName "fooBarBoo_grill"
set pieces [regexp -all -inline {[a-z]+|[A-Z][a-z]*} $companyName]
# pieces = foo Bar Boo grill
接下来,我们需要资本化。我假设您使用的是Tcl 8.6,因此它具有lmap
,因为它非常适合此任务。 string totitle
命令已存在很长时间了。
set pieces [lmap word $pieces {string totitle $word}]
# pieces = Foo Bar Boo Grill
该列表可能需要更多调整,或者它可能是正常的。如果您有O'Hanrahan
这样的爱尔兰名称,或者您需要在Inc
之前和之后插入逗号,那么可能需要进行调整的示例。
最后,我们应该set companyName [join $pieces]
正确地找回一个真正的字符串,但这并不会产生明显的效果,而单词列表完全是用字母组成的。此外,如果您已插入前缀标点符号(, Inc.
案例),则可能需要使用正则表达式进行更复杂的连接。
如果我是真的这样做,我会尝试在其他地方直接表达正确的公司名称而不是依赖文件名。更容易做对!