найти соответствие для строки в Perl - PullRequest
1 голос
/ 04 ноября 2011

Я новичок в Perl. Может кто-нибудь помочь мне, как правильно извлечь данные из сценария ниже?

#####################################################################
#! /usr/bin/perl
$text = "Name: Anne Lorrence Name: Burkart Name: Claire Name: Dan" ;
$match = 0 ;
while ($text =~ /Name: \b(\S+)\s+(\S+)\b/g || /Name: \b(\S+)\b/g) {
    ++ $match ;
print "Match number $match is $1 $2\n" ;
}
######################################################################

Я хотел, чтобы мой вывод был примерно таким:

Match number 1 is Anne MLorrence
Match number 2 is Burkart
Match number 3 is Claire 
Match number 4 is Dan

но на самом деле мой сценарий дает мне следующее:

Match number 1 is Anne MLorrence
Match number 2 is Burkart Name

Могу ли я знать, что происходит не так?

1 Ответ

4 голосов
/ 04 ноября 2011
$text = "Name: Anne Lorrence Name: Burkart Name: Claire Name: Dan" ;
$match = 0 ;
while ($text =~ /Name: (.+?)(?= Name:|$)/g) {
    ++ $match ;
    print "Match number $match is $1\n" ;
}

Используется нежадный захват и положительный прогноз нулевой ширины для разграничения полей.

Match number 1 is Anne Lorrence
Match number 2 is Burkart
Match number 3 is Claire
Match number 4 is Dan

Часть |$) является альтернативой. Более простым примером для понимания будет (ABC|DEF), что означает «соответствовать либо« ABC », либо« DEF »». $ - это просто символ конца строки.

Положительный прогноз нулевой ширины объясняется в perlre документах, но я постараюсь подвести итог здесь. Это часть класса паттернов, называемых «Утверждение об осмотре», и название довольно точное. Представьте себе движок регулярных выражений, «оглядывающийся» в точке строки. Используемый здесь «смотрит вперед» в строке для положительного совпадения. Он называется нулевой шириной, потому что он не использует ни одной строки в процессе сопоставления с образцом.

Итак, шаблон /Name: (.+?)(?= Name:|$) говорит:

  1. Матч "Имя:"
  2. Подбирайте и захватывайте как можно меньше
  3. Пока вы не увидите, что следующие символы: «Имя:» или EOL

Возможно, есть более эффективные способы решения вашей задачи, но это кратко и ясно, и дает вам представление о некоторых менее часто используемых частях языка регулярных выражений. Осмотры очень полезны и о них стоит узнать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...