2016-09-07 1 views
0

Я новичок в программировании TCL. Я хочу написать tcl-код, который проверяет, присутствует ли какой-либо из шаблонов HAT GET DOT в данной строке, и если да, то мы должны показать, какой из шаблонов HAT GET DOT присутствует в данной строке. Если в строке присутствует более одного шаблона, должны отображаться все сопоставленные шаблоны. Я написал следующий код, но он отображает только один шаблон, даже если более одного шаблона соответствует данной строке.TCL шаблон соответствия


Может ли кто-нибудь помочь?

Спасибо заранее

Код:

set data1 {asdGETdf ferGETfhgDOT} #data1 is the given string 
foreach index $test_data1 { 
    set result [regexp {ABC|ACC|ADC|AXC} $index match] 
    puts "\n$index" 
    if { $result==1} { 
    puts "MATCH:$match" 
    } else { 
    puts "NO MATCH" 
    } 
} 

output:-asdGETdf 
MATCH:GET 

ferGETfhgDOT 
MATCH:GET 

Для второй строки я ожидаю, что это отображение GET и DOT (не GET в одиночку, как на выходе).

Я думаю, это потому, что regexp заканчивает поиск, как только совпадение найдено. Но как отображать все совпадения шаблонов?

ответ

1

Просто используя флаг -all. Я также немного изменил бы свой скрипт, используя флаг -inline, чтобы получить результаты напрямую, вместо того, чтобы полагаться на переменную match, потому что, когда вы получаете более одного совпадения, она будет удерживать только последнее совпадение. Я также исправил несколько ошибок из вашего фрагмента кода.

set data1 {asdGETdf ferGETfhgDOT} ;#data1 is the given string 
foreach index $data1 { 
    set result [regexp -all -inline -- {HAT|GET|DOT} $index] 
    puts "\n$index" 
    if {$result != ""} { 
     puts "MATCH: $result" 
    } else { 
     puts "NO MATCH" 
    } 
} 

regexp manual

+0

Спасибо Джерри ... Так как я новичок в TCL пожалуйста, вы можете выяснить, почему мы используем - даже тогда, когда мы получаем ответ правильный, без - – joe

+0

@joe о том, что это просто привычка мой. '--' указывает конец флагов. Это в основном важно, если, например, ваш шаблон начинается с '-', он может в противном случае заставить Tcl понять его еще как еще один флаг, и если это не допустимый флаг, дайте вам ошибки. – Jerry

+0

В приведенном выше коде я могу использовать переменную для хранения паттернов HAT GET DOT и использовать эту переменную в regexp, как набор шаблонов {HAT GET DOT}; regexp -all -inline - {$ pattern} $ index – joe