使用Tcl或REgExpr从字符串中提取某些单词

时间:2014-04-10 10:29:19

标签: regex tcl

嗨,我正在尝试从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或正则表达式做到这一点吗?

谢谢, 赤竹

3 个答案:

答案 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

http://tcl.tk/man/tcl8.5/TclCmd/dict.htm