使用正则表达式在 tcl 中的一行中搜索两个模式
Search two patterns in one line in tcl using regex
我有一个字符串如下:
o=India-SIPUA 6264 0 IN IP4 10.77.33.200
现在我需要编写代码来检查字符串“o=India-SIPUA
”以及字符串10.77.33.200
是否存在于上述字符串中。
我写了下面的代码:
[regexp {.*o=India-SIPUA.*10.77.34.200} $buf match],
但它不起作用
我需要从一大堆代码中搜索这 2 个。我正在写下面的
set buffer "v=0
o=India-SIPUA 6264 0 IN IP4 10.77.33.200
s=SIP Call"
set patt "o=India-SIPUA"
set ipaddress "10.77.34.200"
#set port ""
foreach buf [split $buffer "\n"] {
if {[regexp {.*o=$patt.*$ipaddress} $buf match]} {
puts "+++++++Port==$match++++++"
return 1
} else {
puts "Problem in getting port.."
return 0
}
}
但是它总是去到else部分,从不进入if部分。
那你能说说哪里出了问题吗?
使用以下正则表达式:
.*?o=India-SIPUA .*?10\.77\.33\.200.*
.*?匹配任何字符(换行符除外)
量词:*?零次到无限次之间,次数越少越好,按需扩充[懒惰]
您应该检查指定的值:字符串中有 10.77.33.200
,正则表达式中有 10.77.34.200
。另外,注意.
:要匹配文字点,需要转义。
这是找到两个值的工作代码:
set buff "SOME TEXT o=India-SIPUA 6264 0 IN IP4 10.77.33.200"
regexp {.*o=India-SIPUA.*10\.77\.33\.200} $buff match
puts $match
见demo
编辑:
要匹配IP的第3组中的任意2位数字,可以使用\d{2}
(see demo):
set buff "SOME TEXT o=India-SIPUA 6264 0 IN IP4 10.77.33.200"
regexp {.*o=India-SIPUA.*(10\.77\.\d{2}\.200)} $buff match ip
puts $match
puts $ip
输出:
SOME TEXT o=India-SIPUA 6264 0 IN IP4 10.77.33.200
10.77.33.200
您不需要为此进行正则表达式匹配:
set a o=India-SIPUA
set b 10.77.33.200
if { [string first $a $buff] != -1 && [string first $b $buff] != -1 } {
puts match
}
您的代码的问题是替换 不是 在大括号内执行,因此您将必须使用引号并在正则表达式中双重转义任何转义符:
set buffer "v=0
o=India-SIPUA 6264 0 IN IP4 10.77.33.200
s=SIP Call"
set patt "India-SIPUA"
# Here we have to raw the string and I changed your pattern
set ipaddress [string map {. \.} "10.77.33.200"]
foreach buf [split $buffer "\n"] {
if {[regexp "o=$patt.*\y$ipaddress\y" $buf match]} {
puts "+++++++Port==$match++++++"
} else {
puts "Problem in getting port.."
}
}
stdout
输出:
Problem in getting port..
+++++++Port==o=India-SIPUA 6264 0 IN IP4 10.77.33.200++++++
Problem in getting port..
我有一个字符串如下:
o=India-SIPUA 6264 0 IN IP4 10.77.33.200
现在我需要编写代码来检查字符串“o=India-SIPUA
”以及字符串10.77.33.200
是否存在于上述字符串中。
我写了下面的代码:
[regexp {.*o=India-SIPUA.*10.77.34.200} $buf match],
但它不起作用
我需要从一大堆代码中搜索这 2 个。我正在写下面的
set buffer "v=0
o=India-SIPUA 6264 0 IN IP4 10.77.33.200
s=SIP Call"
set patt "o=India-SIPUA"
set ipaddress "10.77.34.200"
#set port ""
foreach buf [split $buffer "\n"] {
if {[regexp {.*o=$patt.*$ipaddress} $buf match]} {
puts "+++++++Port==$match++++++"
return 1
} else {
puts "Problem in getting port.."
return 0
}
}
但是它总是去到else部分,从不进入if部分。
那你能说说哪里出了问题吗?
使用以下正则表达式:
.*?o=India-SIPUA .*?10\.77\.33\.200.*
.*?匹配任何字符(换行符除外) 量词:*?零次到无限次之间,次数越少越好,按需扩充[懒惰]
您应该检查指定的值:字符串中有 10.77.33.200
,正则表达式中有 10.77.34.200
。另外,注意.
:要匹配文字点,需要转义。
这是找到两个值的工作代码:
set buff "SOME TEXT o=India-SIPUA 6264 0 IN IP4 10.77.33.200"
regexp {.*o=India-SIPUA.*10\.77\.33\.200} $buff match
puts $match
见demo
编辑:
要匹配IP的第3组中的任意2位数字,可以使用\d{2}
(see demo):
set buff "SOME TEXT o=India-SIPUA 6264 0 IN IP4 10.77.33.200"
regexp {.*o=India-SIPUA.*(10\.77\.\d{2}\.200)} $buff match ip
puts $match
puts $ip
输出:
SOME TEXT o=India-SIPUA 6264 0 IN IP4 10.77.33.200
10.77.33.200
您不需要为此进行正则表达式匹配:
set a o=India-SIPUA
set b 10.77.33.200
if { [string first $a $buff] != -1 && [string first $b $buff] != -1 } {
puts match
}
您的代码的问题是替换 不是 在大括号内执行,因此您将必须使用引号并在正则表达式中双重转义任何转义符:
set buffer "v=0
o=India-SIPUA 6264 0 IN IP4 10.77.33.200
s=SIP Call"
set patt "India-SIPUA"
# Here we have to raw the string and I changed your pattern
set ipaddress [string map {. \.} "10.77.33.200"]
foreach buf [split $buffer "\n"] {
if {[regexp "o=$patt.*\y$ipaddress\y" $buf match]} {
puts "+++++++Port==$match++++++"
} else {
puts "Problem in getting port.."
}
}
stdout
输出:
Problem in getting port..
+++++++Port==o=India-SIPUA 6264 0 IN IP4 10.77.33.200++++++
Problem in getting port..