У меня есть это выражение TCL:

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

Это извлекает значение companyName из c:/companyName..., и мне нужно разделить это значение перед первой заглавной буквой на Company Name. Любые идеи?

Заранее спасибо.

tcl
0
Alejo 13 Мар 2018 в 00:18

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.).


Если бы я делал это по-настоящему, я бы попытался указать правильное название компании прямо в другом месте, а не полагаться на имя файла. Намного проще получить право!

2
Donal Fellows 13 Мар 2018 в 06:50

Для начала попробуйте использовать

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, чтобы изменить первую букву первого слова на верхний регистр.

Документация: файлом, lindex, regexp, string, Синтаксис регулярных выражений Tcl

2
Peter Lewerin 12 Мар 2018 в 21:54