假设我有以下字符串:
m=audio 56000 RTP/AVP 0 8 18 205 150 101
o=India-SIPUA 2331 0 IN IP4 10.77.34.6
s=SIP Call
m=audio 22058 RTP/AVP 0 8 18 105 104 101
c=IN IP4 10.77.34.6
现在我需要根据搜索字符串“o = India-SIPUA 2331 0 IN IP4 10.77.34.6”搜索第二个“m = audio”
为此我得到以下代码来搜索字符串“o = India-SIPUA 2331 0 IN IP4 10.77.34.6”
set buffer "m=audio 56000 RTP/AVP 0 8 18 205 150 101
o=India-SIPUA 2331 0 IN IP4 10.77.34.6
s=SIP Call
m=audio 22058 RTP/AVP 0 8 18 105 104 101
c=IN IP4 10.77.34.6"
set patt "India-SIPUA"
set ipaddress "10.77.34.6"
foreach buf [split $buffer "\n"] {
if {[regexp "o=$patt.*$ipaddress" $buf match]} {
puts "+++++++Port==$match++++++"
break
} else {
puts "\n Not found"
}
}
现在应该写什么才能获得紧跟在字符串“o = India-SIPUA ...”之后的m =音频字符串
答案 0 :(得分:1)
你可以像这样一次通过:
#!/usr/bin/tclsh
set buffer "m=audio 56000 RTP/AVP 0 8 18 205 150 101
o=India-SIPUA 2331 0 IN IP4 10.77.34.6
s=SIP Call
m=audio 22058 RTP/AVP 0 8 18 105 104 101
c=IN IP4 10.77.34.6"
set patt "India-SIPUA"
set ipaddress "10.77.34.6"
if {[regexp "(o=$patt.+$ipaddress)\n(?:.*\n)*(m=audio .*)\n.*" $buffer match match1 match2]} {
puts "+++++++Port==$match1++++++"
puts "+++++++Audio==$match2+++++"
}
正则表达式本身:
(o=$patt.+$ipaddress)\n(?:.*\n)*(m=audio .*)\n.*
(o=$patt.+$ipaddress)\n
与()
匹配的第一个捕获组o=...[your pattern]
,直到\n
(未捕获)(?:.*\n)*
非捕获文字组,最后有换行符,*
运算符与此组匹配无或多次(m=audio .*)\n
第二个捕获组()
与m=audio
行匹配,直至\n
(未捕获).*
只是为了匹配缓冲区的其余部分,而不是捕获它。对于regexp
中的变量,首先是匹配,其他是捕获组的目的地。
如果缓冲区匹配,则使用前缀打印两个捕获的组。
输出:
./script.tcl
+++++++Port==o=India-SIPUA 2331 0 IN IP4 10.77.34.6++++++
+++++++Audio==m=audio 22058 RTP/AVP 0 8 18 105 104 101+++++
答案 1 :(得分:1)
使用标志知道您是否在then
测试标志中找到了第一个模式,并将patt
的内容更改为您需要匹配的正则表达式,更改标记和继续循环,或找到第二个模式,你就打破了循环。