Как я могу получить несколько совпадений с одного и того же регулярного выражения Perl? - PullRequest
24 голосов
/ 21 мая 2010

Я пытаюсь проанализировать одну строку и получить несколько фрагментов данных из одной строки с одинаковыми условиями регулярных выражений. Я анализирую один HTML-документ, который является статическим (по нераскрытой причине я не могу использовать анализатор HTML, чтобы сделать работу.) У меня есть выражение, которое выглядит как:

$string =~ /\<img\ssrc\="(.*)"/;

и я хочу получить значение 1 доллар. Однако в одной строке есть много тегов img, подобных этому, поэтому мне нужно что-то вроде возвращаемого массива (@ 1?) Возможно ли это?

Ответы [ 4 ]

22 голосов
/ 21 мая 2010

В качестве ответа Джима используйте модификатор / g (в контексте списка или в цикле).

Но остерегайтесь жадности, вы не хотите, чтобы .* соответствовал больше, чем необходимо (и не уходите

while($string =~ /<img\s+src="(.*?)"/g ) {
  ...
} 
10 голосов
/ 21 мая 2010
@list = ($string =~ m/\<img\ssrc\="(.*)"/g);

Модификатор g соответствует всем вхождениям в строке. Контекст списка возвращает все совпадения. См. Оператор m // в perlop .

5 голосов
/ 21 мая 2010

Вам просто нужен глобальный модификатор / g в конце матча. Затем перебрать пока не осталось ни одного совпадения

my @matches;
while ($string =~ /\<img\ssrc\="(.*)"/g) {
        push(@matches, $1);
}
3 голосов
/ 21 мая 2010

Используйте модификатор / g и контекст списка слева, как в

@result = $string =~ /\<img\ssrc\="(.*)"/g;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...