如何使用正则表达式仅提取两个字段

时间:2019-11-26 12:25:38

标签: regex networking tcl

在TCL中,我正在为以下输出编写正则表达式:

输出参数为

 packet-filter 0
   identifier      0
   direction       bidirectional
   network-ip      10.7.98.231/32
   ue-port-start   0
   ue-port-end     0
   nw-port-start   0
   nw-port-end     0
   protocol        1
   precedence      0
 packet-filter 1
   identifier      1
   direction       uplink
   network-ip      10.7.98.231/32
   ue-port-start   0
   ue-port-end     0
   nw-port-start   0
   nw-port-end     0
   protocol        1
   precedence      0

我的正则表达式的输出:regexp -all -inline {direction\s+(\S+)} $args

{direction       bidirectional} bidirectional {direction       uplink} uplink

我需要提取方向值bidirectionaluplink

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

对于当前情况,当捕获的子字符串是非空白文本块时,您可以重新构建输出,以检查每个项目的长度是否设置为<div> <input type="text" name="fullname" id="name"> </div>

1

然后,set results [regexp -all -inline {direction\s+(\S+)} $args] set res {} foreach item $results { if {[llength $item] == 1} { lappend res $item } } 将仅容纳$resbidirectional

请参见Tcl demo

对于更一般的情况,您可以使用

uplink

请参见this Tcl demo

您可以添加更多set res {} foreach {whole capture1} $results { lappend res $capture1 } 参数来容纳正则表达式返回的所有捕获组值。

答案 1 :(得分:1)

您只需要一个循环或类似的东西。如果您需要分别在每个方向上工作,则适合使用foreach循环:

set results [regexp -all -inline {direction\s+(\S+)} $args]
foreach {main sub} $results {
    puts $sub
}

# bidirectional
# uplink

或者,如果您需要路线列表,那么lmap听起来很合适:

set directions [lmap {main sub} $results {set sub}]
# bidirectional uplink

答案 2 :(得分:1)

regexp不是绝对必要的,您可以将args的值处理成字典:

set d [dict create]
foreach {k v} $args {
    dict lappend d $k $v
}

puts [dict get $d direction]