2015-06-09 39 views
0

我有一個Tcl腳本Tcl的正則表達式混亂

$a_list - {Hello1.my.name.is.not.adam.go.away, 
      Hello2.my.name.is.not.adam, 
      Hello3.my.name.is.not.adam.leave.me} 

foreach a $a_list {if {[regexp adam [regsub {.*\.} $a {}]] == 1} {puts $a} } 

下面的代碼我的理解是,這會在$的a_list串亞當和亞當是最後一個字符串它匹配。 例如

Hello1.my.name.is.not.adam.go.away ---> NO MATCH 
Hello2.my.name.is.not.adam   ---> MATCH 
Hello3.my.name.is.not.adam.leave.me ---> NO MATCH 

我現在面臨的問題是,我想,以配合亞當,然後包括亞當本身後剝去了一切。 例如

Hello1.my.name.is.not.adam.go.away ---> MATCH 
Hello2.my.name.is.not.adam   ---> MATCH 
Hello3.my.name.is.not.adam.leave.me ---> MATCH 

在上述所有情況下,應該字符串變成

Hello1.my.name.is.not ---> MATCH 
Hello2.my.name.is.not ---> MATCH 
Hello3.my.name.is.not ---> MATCH 

您的幫助表示讚賞。 感謝

回答

1

方法1:

通過簡單的命令string,我們可以得到想要的結果。

set input {Hello1.my.name.is.not.adam.go.away, Hello2.my.name.is.not.adam, Hello3.my.name.is.not.adam.leave.me noobuntu dinesh} 
foreach elem $input { 
    # Getting the index of the word 'adam' in each element 
    set idx [string first "adam" $elem] 
    # If the word is not available, then 'idx' will have the value as '-1' 
    if {$idx!=-1} { 
     # string range will give the substring for the given indices 
     puts "->[string range $elem 0 [expr {$idx-1}]]" 
    } 
} 

會給輸出如下,

->Hello1.my.name.is.not. 
->Hello2.my.name.is.not. 
->Hello3.my.name.is.not. 

方法2:

如果你只打算用正則表達式模式,那麼它可以通過regsub命令

set input {Hello1.my.name.is.not.adam.go.away, Hello2.my.name.is.not.adam, Hello3.my.name.is.not.adam.leave.me noobuntu dinesh} 
foreach elem $input { 
    if {[regsub {(.*?)adam.*$} $elem {\1} result]} { 
     puts "->$result" 
    } 
} 
扭捏

將產生輸出爲

->Hello1.my.name.is.not. 
->Hello2.my.name.is.not. 
->Hello3.my.name.is.not. 

參考:stringregsub

+2

'regsub {亞當*} $ ELEM {} result'要簡單得多海事組織。 – Jerry

1

剝離字adam及其之後的所有列表中的每個元素的最簡單的方法,可以使用一個簡單的regsublmap

% lmap s $a_list {regsub {\madam\M.*} $s ""} 
Hello1.my.name.is.not. Hello2.my.name.is.not. Hello3.my.name.is.not. 

\m只匹配一個單詞的開頭,而\M只匹配單詞的結尾。它的工作原理是因爲如果這個詞不是,那麼regsub什麼也不做。


使用Tcl 8.5?你不會有lmap,並且將需要做這個:

set result {} 
foreach s $a_list { 
    lappend result [regsub {\madam\M.*} $s ""] 
} 
# The altered list is now in $result