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