首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用lsearch和regexp从hierarchical_names列表中过滤只有n层层次结构的hierarchical_names

如何使用lsearch和regexp从hierarchical_names列表中过滤只有n层层次结构的hierarchical_names
EN

Stack Overflow用户
提问于 2019-06-26 18:04:37
回答 3查看 89关注 0票数 0

hierarchy_names = a/b/c a x d/e f/g h/i/j/k l/m/n o/p我正试图从具有多级hierarchy_names的列表中过滤掉2 level、hierarchy_names、d/ef/go/p

我尝试了lsearch,但问题是,它返回的匹配具有大于或等于2 ie a/b/c d/e f/g h/i/j/k l/m/n o/p的层次级别,但不完全等于2 ie d/e f/g <代码>d15,这是由于它的contains模式返回元素的算法。我也尝试过regexp,但它的问题是,它返回2级hierarchy_names以及在更高级别的hierarchy_names中存在的部分2级层次结构,即a/b d/e f/g h/I j/k l/m

代码语言:javascript
复制
set hier {a/b/c a x d/e f/g h/i/j/k l/m/n}
puts [lsearch -all -inline -regexp $hier {\w+/\w+}]
puts [regexp -all -inline {\w+/\w+} $hier]

d/e f/g o/p

EN

回答 3

Stack Overflow用户

发布于 2019-06-26 18:11:54

在这种情况下,线锚可能会对您有所帮助。

代码语言:javascript
复制
% lsearch -all -inline -regexp $hier {^\w+/\w+$}
d/e f/g
票数 1
EN

Stack Overflow用户

发布于 2019-06-26 20:38:17

我会在Tcl的工具库中使用一个不同的工具(假设您有Tcl 8.6)。

代码语言:javascript
复制
set hierarchy_names {a/b/c a x d/e f/g h/i/j/k l/m/n o/p}
set filtered [lmap n $hierarchy_names {
    if {[llength [file split $n]] != 2} continue
    string cat $n
}]
puts $filtered
# d/e f/g o/p

这将使用lmap将一个简短的脚本应用于列表的每个元素。列表的结果要么是continue信号(跳过元素),要么是元素;测试是通过查看file split的输出列表的长度来完成的。

票数 1
EN

Stack Overflow用户

发布于 2019-06-27 06:27:28

如何处理regexp?

你可以像这样设计一个正则表达式:

代码语言:javascript
复制
 (?:\s+|^)(\w+/\w+)(?=\s+|$)

  • 第一个非捕获组将匹配模式锚定在字符串或列表元素的开头。
  • 第二个捕获组实际上存储了您要查找的内容。
  • 正向先行确保匹配模式不会变得过于贪婪(即流入后续列表元素)。

这将返回一个偶数匹配列表,在奇数位置有一个子匹配。要过滤掉它们,您可以使用[dict values]或显式[foreach],例如..

代码语言:javascript
复制
dict values [regexp -all -inline -- {(?:\s+|^)(\w+/\w+)(?=\s+|$)} $hier]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56770147

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档