Регулярное выражение возвращает только одно совпадение

Это регулярное выражение возвращает только одно совпадение. (Я хочу получить все источники/местоположения изображений (например, «folder/image.png», содержащиеся в атрибуте src в теге img html).

Пример входной строки:

input = @"<p>here is an image</p><img attr=""ahwer"" src=""~/Images/logo.png"" st=""abc""/><p>some more text here</p>";
            s += @"<p>test</p><img src=""a.jpg"" /><img src=""folder/image.png"" />"

Шаблон

pattern = @"<img.*src=""([^""]*)"".*/>";

Счетчик MatchCollection всегда равен 1 (как ни странно, только последнее совпадение, в данном случае «folder/image.png». Всякий раз, когда я меняю шаблон на просто «img», он находит все три тега изображения. Так что, вероятно, это мой шаблон регулярного выражения неверно Я не гуру регулярных выражений и был бы признателен за любую помощь.


person Gabe    schedule 16.07.2010    source источник
comment
Убедитесь, что у вас есть правильное количество двойных кавычек. Я не знаком с особой разновидностью регулярных выражений .NET, но похоже, что у вас их слишком много как в цели, так и в шаблоне.   -  person MikeD    schedule 17.07.2010
comment
@MikeD: кавычки в порядке. Вот как вы избегаете кавычек в дословных строковых литералах C#: удваивая их.   -  person Alan Moore    schedule 17.07.2010


Ответы (4)


Попробуйте pattern = @"<img.*?src=""([^""]*)"".*?/>"; - используя .*? совпадения не должны быть жадными (т. е. не потреблять все, что могут, до сопоставления со следующей частью).

person Will A    schedule 16.07.2010
comment
Это оно. Получение всех трех матчей сейчас. Я подумал об этом всего за несколько секунд до того, как ты это написал. Спасибо! - person Gabe; 17.07.2010

Не анализировать HTML с помощью регулярных выражений.

Вместо этого следует использовать HTML Agility Pack, например:

var doc = new HtmlDocument();
doc.Load(path);  
//Or 
doc.Parse(source);

var paths = doc.DocumentElement.Descendants("img")
                               .Select(img => img.Attributes["src"].Value);
person SLaks    schedule 16.07.2010
comment
Спасибо за ссылку. Однако я не буду выполнять серьезные манипуляции с HTML, поэтому мне не нужно использовать стороннюю библиотеку. - person Gabe; 17.07.2010

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

Но на самом деле вам не следует пытаться использовать регулярное выражение для анализа HTML. Безумие так и лежит...

person JSBձոգչ    schedule 16.07.2010

Попробуйте образец

pattern = @"(?<=.src="")[\w\/\.~]+";
person Edison Chuang    schedule 16.07.2010