2015-06-09 42 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