2013-04-15 1 views
0

Если у меня есть строка, такие как:TCL Strip выражение (Различная символы)

foo_image_v001.ext

, которые могли бы так же легко сказать

bar_image_v001.ext

Как я могу использовать TCL, чтобы снять первый символ подчеркивания и все справа от него, оставив меня только с «foo» или «bar»

Я обычно парень-питон, не очень разбирающийся в TCL , Но это будет работать лучше в этом случае, если я могу просто заставить его работать =)

ответ

2

Заменить все после первого _

set new [regsub {_.*} $old {}] 
+0

Прохладно, это сработало отлично! Так что, я думаю, regsub - это версия TCL от python? не уверен, что делает -all, и im guessing {_. *} - выражение, выражающееся после подчеркивания, любого символа, на всю длину? то $ old - это мое имя файла, а {} - это то, что im 'sub'ing эти символы с (Blank в нашем случае) правильно? – aescript

+0

['regsub'] (http://www.tcl.tk/man/tcl8.6/TclCmd/regsub.htm) предназначен для замены. Да вы правы. Для сопоставления существует также ['regexp'] (http://www.tcl.tk/man/tcl8.6/TclCmd/regexp.htm). Регулярные выражения очень распространены в большинстве языков программирования. –

+0

Вам не нужен '-all', так как RE будет соответствовать концу строки. –

2

Вот один из способов сделать это:

set filename foo_image_v001.ext 
set prefix [regsub {_.*} $filename ""] 

regsub ищет шаблон {_.*} в $ файла, и замените его на "".

1

Может быть, вы могли бы использовать это?

set string "foo_image_v001.ext" 

regexp -- {^([^_]+)} $string - var 

foo сохраняется в $var.

+0

вы можете сообщить мне, почему id использует этот метод вместо [regsub -all {_. *} $ Old {}] Im просто не получаю двойную тире (regexp -) или {^ ([^ _ ] +)} на первый взгляд я не могу сказать, что означает^(есть ли это значит держать все до тех пор, пока ... тогда [^ _] +) не удаляется _ и все завершающиеся строки $ string? – aescript

+0

Это соответствует всей последовательности с начала ('^'), за которой следуют символы, отличные от '_'. Ненужный '()' для получения результата. '--' означает конец переключателей (важно, если ваше регулярное выражение начинается с' -'). Сохраняет 'foo'' ''. 'regexp {^ [^ _] +} $ старый новый' выполняет ту же работу. –

+0

@ user1917081 Вместо того, чтобы искать все после подчеркивания и заменять ничего, он просто захватывает все перед подчеркиванием (первым) и присваивает его переменной '$ var'. Скобки и конец переключателей (и ловушка в переменной таким образом) - это всего лишь вопрос предпочтения последовательности в моих регулярных выражениях. – Jerry

1

Не нужно выламывать регулярное выражение для этого:

с помощью string команды:

set prefix [string range $filename 0 [expr {[string first _ $filename] - 1}]] 

Кроме того, если разбить строку на подчеркиванием, что вы хотите, это первый элемент результирующий список:

set prefix [lindex [split $filename _] 0] 

 Смежные вопросы

  • Нет связанных вопросов^_^