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

时间:2018-07-13 13:24:19

标签: list tcl regsub

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

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

从该列表中,我只需要像这样的元素:

  

dir1
  dir2
  阿伦

我尝试过regexplsearch,但是没有运气。

方法1:

set idx [lsearch $mylist "."]

set mylist [lreplace $mylist $idx $idx]

方法2:

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

3 个答案:

答案 0 :(得分:1)

lsearch命令有很多选项,其中一些选项可以使此任务变得很容易:

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

答案 1 :(得分:1)

如果方法正确,方法1将会起作用。 lsearch默认返回单个结果,并且搜索条件接受全局模式。使用.只会查找等于.的元素。然后,您需要为lreplace循环:

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

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


如果使用正确的正则表达式,方法2也将起作用:

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

但是在那种情况下,您可能想要调整结果。 .*将匹配换行符以外的任何字符。


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

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

答案 2 :(得分:1)

或者,使用Image(或使用error: The argument type 'Image (C:\flutter\bin\cache\pkg\sky_engine\lib\ui\painting.dart)' can't be assigned to the parameter type 'Image (C:\flutter\packages\flutter\lib\src\widgets\image.dart)'. (argument_type_not_assignable at [ranky] lib\event_selection.dart:53) 的显式循环)为不可接受的元素过滤列表:

lmap

另请参阅有关过滤列表的相关讨论,例如Using `lmap` to filter list of strings