用TCL拆分camelcase值

时间:2018-03-12 21:18:27

标签: tcl

我有这个TCL表达式:

[string toupper [join [lrange [file split [value [topnode].file]] 1 1]]]

这会从companyName检索c:/companyName...值,我需要将该值在第一个大写字母前分成Company Name。有什么想法吗?

提前致谢。

2 个答案:

答案 0 :(得分:2)

首先,尝试使用

lindex [file split [value [topnode].file]] 1

lrange命令将返回一个列表,这可能会导致某些目录名称出现问题。如果您不使用joinlrange命令应毫无意义,而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将第一个单词的第一个字母更改为大写。

文档: filelindexregexpstringSyntax 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.案例),则可能需要使用正则表达式进行更复杂的连接。

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