使用正则表达式在tcl中的一行中搜索两个模式

时间:2015-05-07 08:01:50

标签: regex tcl

我有一个字符串如下:

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
  }
}

但它总是会转向其他部分而永远不会进入if部分。

那么你能说出了什么问题吗?

4 个答案:

答案 0 :(得分:1)

您不需要正则表达式匹配:

set a o=India-SIPUA
set b 10.77.33.200
if { [string first $a $buff] != -1 && [string first $b $buff] != -1 } {
    puts match
}

答案 1 :(得分:1)

你的代码的问题是在大括号内执行而不是的替换,所以你必须使用引号并双重转义正则表达式中的任何转义:

@\[.*\]

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

答案 2 :(得分:0)

使用以下正则表达式:

.*?o=India-SIPUA .*?10\.77\.33\.200.*

。*?匹配任何字符(换行符除外) 量词:*?在零和无限次之间,尽可能少的时间,根据需要扩展[懒惰]

Regex test

答案 3 :(得分:0)

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