使用正则表达式或字符串匹配从列表中删除带有点扩展名的元素
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
我已经尝试了 regexp
和 lsearch
但没有成功。
方法一:
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}}
另请参阅有关过滤列表的相关讨论,例如
我是 Tcl 的新手。我有一个这样的列表:
set list1 {
dir1
fil.txt
dir2
file.xls
arun
baskar.tcl
perl.pl
}
从该列表中我只想要如下元素:
dir1
dir2
arun
我已经尝试了 regexp
和 lsearch
但没有成功。
方法一:
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}}
另请参阅有关过滤列表的相关讨论,例如