2012-04-07 2 views
1

У меня есть следующий пример отформатированной строка:совпадающих пары значений имени без разделителя между ними

== header == information about things ==headeragain== info can have characters like.*?{= 

и т.д. только на одной линии.

Я хочу разобрать это на хэш, чтобы клавиши были «==. +? ==», а значения - информация после клавиш. Я попробовал несколько регулярных выражений глобально соответствуют этим парам:

%hash = $string =~ /(==.+?==)(.+)/g 

и

%hash = $string =~ /(==.+?==)(.+?)/g 

будет соответствовать первый ключ, а затем все остальное в качестве значения, и соответствуют только ключи соответственно.

%hash = $string =~ /(==.+?==)(.+(?===.+?==))/g 

Предполагается, что впереди следующий ключ, но не «съесть его», как я его понимаю. Тем не менее, он будет соответствовать только первой паре и не идти дальше.

Я думаю, эта проблема возникла из-за непонимания того, как действует глобальный модификатор. Нужно ли мне что-то менять в одном из моих выражений? Или мне нужно делать что-то совершенно другое?

ответ

1

Несмотря на то, что вы используете нежирный модификатор, для 2-й подгруппы в вашем втором примере нет ограничений.

Добавить положительный взгляд вперед: (?=$|==) после значения. Здесь (?= - это объявление блока ожидания, а $ или == - подстрока, которую вы ищете.

I.e. решение: /(==.+?==)(.+?)(?=$|==)/g

+0

Спасибо, взгляд на «$», чтобы получить последнюю пару - это то, что мне нужно! Немного глупо от меня. – MattLBeck

1
while ($line =~/
    == \s* 
    (.+?) 
    \s* == \s* 
    (.*?) 
    (?= \s* (?: == | \z)) 
/xg) { 
    my $key = $1; 
    my $val = $2; 
    ... 
} 

Но я не люблю, используя "?" модификатор кванторов. На самом деле это не мешает неправильному согласованию при неправильном или неожиданном вводе. Поэтому я бы воспользовался:

while ($line =~/
    == \s* 
    (\S (?: (?! \s* ==).)*) 
    \s* == \s* 
    ((?: (?! \s* ==).)*) 
/xg) { 
    my $key = $1; 
    my $val = $2; 
    ... 
} 
+0

'(? :(?! PAT).) *' Является 'PAT', так как' [^ CLASSES] 'принадлежит' [CLASSES] '. – ikegami

Смежные вопросы