嗨,我正在尝试从String中提取引擎,这证明了我的测试(保持)。在下面的例子中,我的输出应该是proengine2。
engine1 {status fail reason checked depth 0 } engine2 {status fail reason checked depth 0 }
proengine1 {status open reason checked depth 0 } **proengine2** {status **hold** reason checked depth 1 }
知道如何用Tcl或正则表达式做到这一点吗?
谢谢, 赤竹
答案 0 :(得分:1)
如果您想获取状态为hold
的引擎,请尝试以下操作:
regexp -- {([^\}[:blank:]]+?)\s*?\{status hold} $data - engine
您的引擎将位于$engine
变量中。
([^\}[:blank:]]+?)
将匹配非}
或空白字符(这是引擎名称匹配的位置)并存储到第一个子匹配engine
中,前提是下一个部分匹配,这意味着任何空格\s*?
和{status hold
。
如果你有多个引擎,你可以尝试这样的东西:
set engines [regexp -all -inline -- {[^\}[:blank:]]+?(?=\s*?\{status hold)} $data]
其中$engines
将是hold
上所有引擎的列表。
在这里,我使用正向前瞻而不是捕获组,因为-all -inline
将返回所有匹配和子匹配的列表。正则表达式大致相同,第一对()
被删除,第二部分被(?= ... )
包裹(这是正面的预测)。
答案 1 :(得分:0)
嗨,如果**hold**
的那个星星周围的星星一直保持,那么这里有一个解决方案。这是代码:
String test = "engine1 {status fail reason checked depth 0 } engine2 {status fail reason checked depth 0 } proengine1 {status open reason checked depth 0 } **proengine2** {status **hold** reason checked depth 1 }";
System.out.println(test.replaceAll(".*\\}\\s\\*{2}(.*)\\*{2}\\s\\{.*", "$1"));
输出:proengine2
答案 2 :(得分:0)
幸运的是,您的数据格式化为Tcl字典,因此:
set s {
engine1 {status fail reason checked depth 0 } engine2 {status fail reason checked depth 0 }
proengine1 {status open reason checked depth 0 } proengine2 {status hold reason checked depth 1 }
}
set d [dict create {*}$s]
dict for {key info} $d {
if {[dict get $info status] eq "hold"} {
puts $key
}
}
输出
proengine2