使用正则表达式在 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.*

.*?匹配任何字符(换行符除外) 量词:*?零次到无限次之间,次数越少越好,按需扩充[懒惰]

Regex test

您应该检查指定的值:字符串中有 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..