在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
我需要提取方向值bidirectional
和uplink
有什么建议吗?
答案 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
}
}
将仅容纳$res
和bidirectional
。
请参见Tcl demo。
对于更一般的情况,您可以使用
uplink
您可以添加更多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]