【问题标题】:TCL pattern matchingTCL 模式匹配
【发布时间】:2016-09-07 14:15:21
【问题描述】:

我是 TCL 编程新手。我想编写一个 tcl 代码来检查给定字符串中是否存在任何模式 HAT GET DOT,如果存在,我们应该显示给定字符串中存在模式 HAT GET DOT 中的哪一个。如果字符串中存在多个模式,则应显示所有匹配的模式。我编写了以下代码,但即使多个模式与给定字符串匹配,它也只显示一个模式。


有人可以帮忙吗?

提前谢谢你

代码:

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)。

我认为这是因为一旦找到匹配项,正则表达式就会结束搜索。但是如何显示所有模式匹配?

【问题讨论】:

    标签: regex tcl


    【解决方案1】:

    只需使用-all 标志。我还会稍微更改您的脚本,通过使用-inline 标志直接获取结果,而不是依赖match 变量,因为当您获得多个匹配项时,它只会保留最后一个匹配项。我还修复了您的代码 sn-p 中的一些错误。

    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

    【讨论】:

    • 谢谢 Jerry ...由于我是 TCL 的新手,您能否解释一下我们为什么使用 - 即使我们得到正确的答案而没有 -
    • @joe 哦,这只是我的一个习惯。 -- 表示标志的结束。例如,如果您的模式以- 开头,这一点最重要,否则可能会导致 Tcl 将其理解为另一个标志,如果那不是有效标志,则会给您错误。
    • 在上面的代码中,我可以使用变量来存储模式 HAT GET DOT 并在正则表达式中使用该变量,例如设置模式 {HAT GET DOT} ;正则表达式 -all -inline -- {$pattern} $index
    • @joe 你可以这样做,但是你需要去掉大括号{}。你会做set pattern {HAT GET DOT} 然后regexp -all -inline -- $pattern $index
    • @joe 哦,你想要同样的模式吗?然后你需要像你一样写它:set pattern {HAT|GET|DOT}
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    相关资源
    最近更新 更多