2015-11-10 2 views
0

Есть много вопросов о регулярных выражениях в ожидании, но я не нашел ответа. Я новичок в ожидании, но не в регулярных выражениях. У меня есть переменный в качестве сценария ожидать с этим текстом:ожидать: разбор переменной

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

ответ

0

Вы можете попробовать это регулярное выражение,

:\s(.+) 

Она захватывает группу.

Demo

+0

Спасибо за ответ, но я имею более основную проблему там, где она кажется \ s не интерпретируются как общий пробельный матч в моем сценарии –

+0

это работает Здесь хорошо, https://regex101.com/r/bO4aX4/2. Не знаю, в чем проблема – apgp88

+0

Проблема в том, что '\ s' интерпретируется как' s' ... –

2

Хотя \sявляется признан пробельных на RE двигателя, это преимущественно рассматривается как цитируемый s на общем уровне языка; не то, что вы хотите! Лучше всего поставить регулярные выражения в { фигурные скобки } вместо " двойные кавычки ", поскольку это препятствует этим нежелательным экранам (и другим тоже).

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

Единственный случай, когда возникают реальные проблемы, - это когда вы хотите сохранить часть регулярного выражения в переменной. Это гораздо менее распространенная ситуация, чем желание движка синтаксического анализа языка Tcl держаться подальше от вашего пути.

+0

Да! Спасибо. –

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 
Смежные вопросы