2014-02-02 3 views
2

Я следующий вид строки наборов в текстовом файле:Regex помощь - соответствует любому числу символов

<< /ImageType 1 
/Width 986 /Height 1 
/BitsPerComponent 8 
/Decode [0 1 0 1 0 1] 
/ImageMatrix [986 0 0 -1 0 1] 
/DataSource < 
803fe0503824160d0784426150b864361d0f8844625138a4562d178c466351b8e4763d1f904864523924964d27944a6552b964b65d2f984c665339a4d66d379c4e6753b9e4f67d3fa05068543a25168d47a4526954ba648202 
> /LZWDecode filter >> image } def 

Есть 100s изображений, определенных как выше.

Мне нужно найти все такие изображения, определенные в документе.
Вот мой код -

string txtFile = @"text file path"; 
string fileContents = File.ReadAllText(txtFile); 

string pattern = @"<< /ImageType 1.*(\n|\r|\r\n)*image } def"; //match any number of characters between `<< /ImageType 1` and `image } def` 
MatchCollection matchCollection = Regex.Matches(fileContents, pattern, RegexOptions.Singleline); 
int count = matchCollection.Count; // returns 1 

Однако, я получаю только один матч - в то время как существует около 600 изображений, определенных.
Но кажется, что все они сопоставлены в одном из-за символа «новой строки», используемого в шаблоне.

Может кто-нибудь, пожалуйста, руководство, что мне нужно изменить правильный результат регулярных выражений матча в 600.

ответ

1

Причина в том, что регулярные выражения обычно жадные, то есть совпадения всегда как можно дольше. Таким образом, image } def содержится в .*. Я думаю, что лучший подход здесь - выполнить два отдельных запроса регулярных выражений, один для << /ImageType 1 и один для image } def. Каждое совпадение первого шаблона будет соответствовать точно одному совпадению второго, и поскольку эти совпадения несут свои индексы в исходной строке, вы можете восстановить изображение, обратившись к соответствующей подстроке.

0

Вместо .* вы должны использовать не жадный квантор .*?:

string pattern = @"<< /ImageType 1.*?image } def"; 
Смежные вопросы