Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 使用正则表达式或字符串匹配从列表中删除具有点扩展名的元素_List_Tcl_Regsub - Fatal编程技术网

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

List 使用正则表达式或字符串匹配从列表中删除具有点扩展名的元素,list,tcl,regsub,List,Tcl,Regsub,我是Tcl的新手。我有这样一份清单: set list1 { dir1 fil.txt dir2 file.xls arun baskar.tcl perl.pl } 从该列表中,我只需要以下元素: dir1 dir2 阿伦 我尝试了regexp和lsearch,但没有成功 方法1: set idx [lsearch $mylist "."] set mylist [lreplace $mylist $idx $idx] 方法2: s

我是Tcl的新手。我有这样一份清单:

set list1 {
    dir1
    fil.txt
    dir2
    file.xls
    arun
    baskar.tcl
    perl.pl
}
从该列表中,我只需要以下元素:

dir1
dir2
阿伦

我尝试了
regexp
lsearch
,但没有成功

方法1:

set idx [lsearch $mylist "."]

set mylist [lreplace $mylist $idx $idx]
方法2:

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

lsearch命令有许多选项,其中一些选项有助于简化此任务:

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

如果你做得好,方法1就会起作用<默认情况下,code>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 ""]
但在这种情况下,您可能会希望调整结果<代码>*将匹配除换行符以外的任何字符


我可能会这样使用,这样可以避免更换:

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

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


另请参阅有关筛选列表的相关讨论,例如捕获的Thx(以前使用
字符串cat
时留下的)。看起来您可能正在从
glob
生成列表,并且可能正在该列表中查找目录。您知道吗,您可以将选项
-type d
(用于目录)传递到
glob
,让它为您进行文件类型筛选?(相反,查找文件的类型
f
)非常有用!我看过一些关于目录列表的文档,但我对自己的想法很满意。无论如何谢谢@DonalFellows
lmap el $list1 {if {[string first . $el] >= 0} {continue} else {set el}}