Tcl Regexp混乱

时间:2015-06-09 13:54:46

标签: regex 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中查找字符串adam,并且当adam是最后一个字符串时它匹配。 例如

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

感谢您的帮助。 感谢

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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