У меня есть это выражение TCL:
[string toupper [join [lrange [file split [value [topnode].file]] 1 1]]]
Это извлекает значение companyName
из c:/companyName...
, и мне нужно разделить это значение перед первой заглавной буквой на Company Name
. Любые идеи?
Заранее спасибо.
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.
).
Если бы я делал это по-настоящему, я бы попытался указать правильное название компании прямо в другом месте, а не полагаться на имя файла. Намного проще получить право!
Для начала попробуйте использовать
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
Похожие вопросы
Новые вопросы
tcl
Инструмент Command Language был изобретен Джоном Оустерхаутом как способ облегчить написание небольших языков для настройки инструментов EDA, но он далеко вышел за эти скромные начала и стал общим языком сценариев со встроенными асинхронными вводами-выводами и Unicode-строками. поддерживая парадигмы, такие как объектно-ориентированное программирование и сопрограммы.