2016-09-07 119 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 

對於第二個字符串我希望它獨顯GETDOT(不GET在輸出)。

我認爲這是因爲正則表達式一旦找到匹配就結束搜索。但如何顯示所有模式匹配?

回答

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並使用該變量在正則表達式中設置模式{HAT GET DOT}; regexp -all -inline - {$ pattern} $ index – joe