expect:解析变量

时间:2015-11-10 23:40:50

标签: regex tcl expect

关于正则表达式有很多问题,但是我没有找到答案。我是新手,但不是正则表达式。我在这个文本的期望脚本中有一个变量:

IP Address Source       : Static Address
IP Address              : 1.2.3.4
Subnet Mask             : 255.255.255.0

我想解析冒号右侧的值。我尝试了以下各种版本,但我没有得到匹配。

if { [regexp -linestop "IP Address\s*:\s*(.+)" $network ignore ip] } {
   puts "IP: ($ip)"
}

似乎\ s未被认为是期望的空白?还尝试了[[:space:]]的版本。我需要寻找空格来区分第二行和第一行。这符合某些东西(不是我想要的)但是当我添加'\ s'时,它根本不匹配。

if { [regexp -linestop "IP Address(.+)" $network ignore ip] } {
   puts "IP: ($ip)"
}

3 个答案:

答案 0 :(得分:2)

虽然RE引擎将\s 识别为空白,但它在一般语言级别优先被视为引用s;不是你想要的!到目前为止,将正则表达式放在{括号}而不是"双引号"中会更好,因为这会抑制这些不必要的转义(以及其他的)。

if { [regexp -linestop {IP Address\s*:\s*(.+)} $network ignore ip] } {
   puts "IP: ($ip)"
}

这会导致实际问题的唯一时间是您希望将正则表达式的一部分保留在变量中。这比不希望Tcl语言解析引擎不受影响的情况要小得多。

答案 1 :(得分:1)

如果你想要全部:

% set x {IP Address Source       : Static Address
IP Address              : 1.2.3.4
Subnet Mask             : 255.255.255.0}
% foreach {all match} [regexp -line -all -inline {: (.*)} $x] {
    lappend values $match
}
% set values
{Static Address} 1.2.3.4 255.255.255.0

答案 2 :(得分:0)

你可以试试这个正则表达式,

:\s(.+)

它抓住了小组。

Demo