$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:|$)
говорит:
- Матч "Имя:"
- Подбирайте и захватывайте как можно меньше
- Пока вы не увидите, что следующие символы: «Имя:» или EOL
Возможно, есть более эффективные способы решения вашей задачи, но это кратко и ясно, и дает вам представление о некоторых менее часто используемых частях языка регулярных выражений. Осмотры очень полезны и о них стоит узнать.