regex TCL正则表达式仅匹配列表中的完整单词

wlzqhblo  于 2022-12-24  发布在  其他
关注(0)|答案(3)|浏览(210)

我在TCL中使用regexp命令来获取某个字符串在列表中出现的次数。因此,我创建了以下示例:

set text "Gi Gi Gi Tw Tw Tw Tw Tw Tw Tw Tw Tw Tw Twe Twe Gi Gi Te Te Te Te"
set things2searchfor "Gi Te Tw Twe"

foreach entry $things2searchfor {
    set allregexmatches [regexp -all -inline $entry $text]
    set numbrofmatches [llength $allregexmatches]
    puts "There are $numbrofmatches matches found for $entry and they all are: $allregexmatches"
}

当我运行脚本时,它会得到以下输出:

There are 5 matches found for Gi and they all are: Gi Gi Gi Gi Gi
There are 4 matches found for Te and they all are: Te Te Te Te
There are 12 matches found for Tw and they all are: Tw Tw Tw Tw Tw Tw Tw Tw Tw Tw Tw Tw
There are 2 matches found for Twe and they all are: Twe Twe

所以我的问题是,我在原始列表中只有10个Twe条目,但是正则表达式也匹配了两个Twe,导致匹配计数达到12。
所以大多数正则表达式的解决方案都要求我使用美元符号来标记一行的结尾,这会导致只匹配最后一个Te,因为它在行的结尾,其他的解决方案是不匹配XYZ,但是当我使用变量时,我不能绝对不匹配xyz,因为输入是不同的每一个foreach和完全不同的每一个网络设备。我尝试使用单词boundry /b,但也不起作用。
有没有其他解决方案可以只匹配完整的单词而不是部分单词?我不能使用lsearch命令,因为我在这里使用的是TCL 8.3...(感谢思科)

bis0qfac

bis0qfac1#

好的,我刚刚找到的解决方案后,阅读TCL Regex帮助页面在这里:https://www.tcl.tk/man/tcl8.4/TclCmd/re_syntax.html#M30这里写着:
\M -仅匹配单词结尾
我将TCL中的正则表达式(使用额外的退格键转义)更改为:

[regexp -all -inline "$entry\\M" $text]

现在它按预期工作:

There are 5 matches found for Gi (searchpattern: Gi\M) and they all are: Gi Gi Gi Gi Gi
There are 4 matches found for Te (searchpattern: Te\M) and they all are: Te Te Te Te
There are 10 matches found for Tw (searchpattern: Tw\M) and they all are: Tw Tw Tw Tw Tw Tw Tw Tw Tw Tw
There are 2 matches found for Twe (searchpattern: Twe\M) and they all are: Twe Twe

抱歉在完全阅读所有手册之前发帖。感谢任何可能已经投入任何资源寻找答案的人。

pod7payv

pod7payv2#

没有regexp的解决方案

set text "Gi Gi Gi Tw Tw Tw Tw Tw Tw Tw Tw Tw Tw Twe Twe Gi Gi Te Te Te Te"    
foreach entry $text {
    switch -exact -- $entry {
        Gi  {incr Gi}
        Te  {incr Te}
        Tw  {incr Tw}
        Twe {incr Twe}
    }
}

8.3中未测试

2eafrhcq

2eafrhcq3#

类似于@Mkn的策略,但将所有内容都计入口述。

foreach item $text {
    dict incr counts $item
}
foreach item $things2searchfor {
    puts "$item\t[dict get $counts $item]"
}
Gi  5
Te  4
Tw  10
Twe 2

相关问题