使用正则表达式或字符串匹配从列表中删除带有点扩展名的元素

Remove elements with dot extension from list using regex or string matching

我是 Tcl 的新手。我有一个这样的列表:

set list1 {
    dir1
    fil.txt
    dir2
    file.xls
    arun
    baskar.tcl
    perl.pl
}

从该列表中我只想要如下元素:

dir1
dir2
arun

我已经尝试了 regexplsearch 但没有成功。

方法一:

set idx [lsearch $mylist "."]

set mylist [lreplace $mylist $idx $idx]

方法二:

set b [regsub -all -line {\.} $mylist "" lines]

lsearch 命令有很多选项,其中一些选项可以帮助简化此任务:

lsearch -all -inline -not $list1 *.*

方法 1 如果您操作得当,就会奏效。 lsearch returns 默认为单个结果,搜索条件接受 glob 模式。使用 . 只会查找等于 . 的元素。然后你需要一个 lreplace:

的循环
set idx [lsearch -all $list1 "*.*"]
foreach id [lsort -decreasing $idx] {
    set list1 [lreplace $list1 $id $id]
}

按降序排序很重要,因为元素的索引会随着您删除元素而改变(另请注意,您在代码片段中使用了错误的变量名)。


如果您使用正确的正则表达式,方法 2 也可以工作:

set b [regsub -all -line {.*\..*} $list1 ""]

但在那种情况下,您可能希望 trim 结果。 .* 将匹配除换行符之外的任何字符。


我可能会像这样使用 lsearch,这样就不需要替换:

set mylist [lsearch -all -inline -not $list1 "*.*"]

或者,使用 lmap(或使用 foreach 的显式循环)过滤未接受元素的列表:

lmap el $list1 {if {[string first . $el] >= 0} {continue} else {set el}}

另请参阅有关过滤列表的相关讨论,例如