2015-02-17 3 views
0

У меня есть строки, которые имеют такой же рисунок .... Как, например переменная может содержать следующие закономерностиИзвлечение определенный шаблон из строки с помощью regsub в TCL

1) { { pin_name1 net_name1 } } { { pin_name2 net_name2 } } 
2) { { pin_name1 net_name1 } } 
3) { { pin_name1 net_name1 } } { { pin_name2 } } 
4) { { pin_name1 net_name1 } } { { pin_name2 } } { { pin_name3 net_name3 } }... 

Ожидаемый выход

1) pin_name1 net_name1 pin_name2 net_name2 
2) pin_name1 net_name1 
3) pin_name1 net_name1 
4) pin_name1 net_name1 pin_name3 net_name3 

Строка содержит 1 для многих таких комбинаций {pin_name net_name} ..... всякий раз, когда net_name отсутствует в комбинации, которая не должна присутствовать в окончательном выходе

Я пробовал код в Tcl, используя regsub следующим образом (предположим, что «а» переменная, которая содержит входную строку)

regsub -all { } $a {mango} a 
regsub -all {\W*mango\M} $a "" a 
regsub -all "{" $a "" a 
regsub -all "}" $a "" a 
puts "$a" 

Приведенный выше код не помогает мне.

ответ

0

Мой мыслительный процесс: удалить все брекеты. Это оставит много лишнего пробел, поэтому чистить, что до обрезки от начала и конца, то сжимая все пробеги пространства к одному одно:

set str "{ { pin_name1 net_name1 } } { { pin_name2 net_name2 } }" 
set new [regsub {\s{2,}} [string trim [string map {"{" "" "}" ""} $str]] " "] 
puts $new 
pin_name1 net_name1 pin_name2 net_name2 
+0

Спасибо ... Я пытался подобным образом ... но в конце концов я хочу комбинацию, для которой как net_name, так и pin_name, которые будут включены new..If u, см. пример 3) выше не удовлетворит этот случай :) –

0

Вы могли бы написать простое регулярное выражение для этого:

{ { ([A-Za-z0-9_]+) ([A-Za-z0-9_]+) } } 

Это будет при успешном согласовании найти две группы, группа 1 содержит имя_имя и группу 2 имя_и_.

Вы также можете расширить класс символов, чтобы он соответствовал только A-Z, a-z, 0-9 и _.

Попробуйте здесь: http://regexr.com/3aeed

0

Если избыток пробельные не проблема, это может сделать:

join [lmap item $var {if {[llength [lindex $item 0]] == 2} {lindex $item 0} continue}] 

(. Для того, чтобы избежать избыточного пробельные, завернуть команду в другой join)

Результат:

pin_name1 net_name1 pin_name2 net_name2 
pin_name1 net_name1 
pin_name1 net_name1 
pin_name1 net_name1 pin_name3 net_name3 

Документация:, if, join, lindex, llength, lmap

0

Такого рода вещи могут быть немного грязный, когда вы пытаетесь использовать регулярное выражение для всего. Иногда проще использовать другой подход. Поскольку мы имеем дело с хорошо сформированными вложенными списками Tcl с простыми строками на листьях, мы можем использовать повторяющийся join, чтобы прояснить ситуацию.

foreach s { 
    "{ { pin_name1 net_name1 } } { { pin_name2 net_name2 } }" 
    "{ { pin_name1 net_name1 } }" 
    "{ { pin_name1 net_name1 } } { { pin_name2 } }" 
    "{ { pin_name1 net_name1 } } { { pin_name2 } } { { pin_name3 net_name3 } }" 
} { 
    puts [join [join [join $s]]] 
} 
# Want to see what this does? Try with fewer [join]s! Go on, give it a go 

несколько более общий вариант, который будет обрабатывать более широкий диапазон возможных уплощения, как это:

proc flatten s { 
    while 1 { 
     set t [join $s] 
     if {$s eq $t} {return $s} 
     set s $t 
    } 
} 
foreach s { 
    "{ { pin_name1 net_name1 } } { { pin_name2 net_name2 } }" 
    "{ { pin_name1 net_name1 } }" 
    "{ { pin_name1 net_name1 } } { { pin_name2 } }" 
    "{ { pin_name1 net_name1 } } { { pin_name2 } } { { pin_name3 net_name3 } }" 
} { 
    puts [flatten $s] 
} 
+0

Они не решают проблему, tho '? –

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