【问题标题】:Regexp Pattern Matching Tcl正则表达式模式匹配 Tcl
【发布时间】:2016-01-06 07:43:55
【问题描述】:

我有file.txt格式的数据

afsdfds/sfsd/sfdsf/VISA_CTS_ec0cbf000an2n06x5_G3B7I1/sfdfdvged/sdvdsfgv ec0cbf000an2n06x5 
afsggggdfds/sfsd/sfdsf/VISA_CTS_ec0clb000an2n10x5_G3B7I1/sfdggggfdvged/sdvdsfgv ec0clb000an2n10x5 
afsdfds/fdddo9045374857_234242/sfsd/sfdsf/VISA_CTS_ec0cilb000an2n16x5_G3B7I1/sfdfdvged/sdvdsfgv ec0cilb000an2n16x5 
qweryt/visa_ec0ceb000an2n20x5_tyiuop/gfds_sfgds_/clock_VISA_CTS_ec0ceb000an2n20x5_G3B7I1/hjkhfjhfd/asdfasdf ec0ceb000an2n20x5 

我在 Tcl 中使用

package require fileutil 

set filename file.txt 
set pattern {ec0cbf|ec0clb|cb|ceb} 
puts "[llength [fileutil::grep $pattern $filename]] occurances" 

$tcl> 7 occurances 

我只希望我的正则表达式返回 file.txt 中最正确的值,我的最终答案是 3 次出现 (ec0cbf000an2n06x5 ec0ceb000an2n20x5 ec0ceb000an2n20x5) )而不是 7 次,因为我没有检测到“cilb”

这个file.txt是动态数据`

【问题讨论】:

  • 我认为这两者都符合您的要求,但我并不肯定:` (.*(?:ec0cbf|ec0clb|cb|ceb).*$)` ([演示](regex101.com/r/sW7bY5/2)) 或` (\S*(?:ec0cbf|ec0clb|cb|ceb).*$)` (demo)
  • 我显示的答案给出了 3 个匹配项,这就是您的问题所说的。在我链接的演示中,“cilb”不匹配。演示没有向您展示吗?
  • @Jota 是的,这正是我正在寻找的正则表达式。谢谢 !它正在工作。
  • " (\S*(?:ec0cbf|ec0clb|ec0ceb).*?$)"

标签: regex tcl


【解决方案1】:

这可以解决你的问题:

set a [open test.txt r]
set data [read $a]
set c [split $data "\n"]
set cnt 0

% foreach d $c {
    if {[regexp {ec0cbf|ec0clb|cb|ceb} $d]} {
        puts "[lindex $d  end]"
        incr cnt
    }
}
puts $cnt

【讨论】:

  • edit你的帖子添加更多信息,下面有一个链接。 cmets 对代码/输出格式不利
  • 输出将是这样的 % foreach d $c { if {[regexp {ec0cbf|ec0clb|cb|ceb} $d]} { puts "[lindex $d end]" incr cnt } } ec0cbf000an2n06x5 ec0clb000an2n10x5 ec0ceb000an2n20x5 % puts $cnt 3
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
相关资源
最近更新 更多