正则表达式帮助 - 匹配任意数量的字符

时间:2014-02-02 22:56:32

标签: c# 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

如上所述定义了100个图像。

我需要找到文件中定义的所有这些图像 这是我的代码 -

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。

3 个答案:

答案 0 :(得分:1)

原因是正则表达式通常是贪婪的,即匹配总是尽可能长。因此,image } def中包含.*。我认为这里最好的方法是执行两个单独的正则表达式查询,一个用于<< /ImageType 1,另一个用于image } def。第一个模式的每个匹配对应于第二个模式的一个匹配,并且由于这些匹配在原始字符串中携带它们的索引,您可以通过访问适当的子字符串来重建图像。

答案 1 :(得分:0)

而不是.*你应该使用非贪婪量词.*?

string pattern = @"<< /ImageType 1.*?image } def";

答案 2 :(得分:-3)

这是一个可以帮助您使用我使用的REGEX的网站。 http://webcheatsheet.com/php/regular_expressions.php

if(preg_match('/^/[a-z]/i', $string, $matches)){

 echo "Match was found <br />";
 echo $matches[0];
}