我在文本文件中有以下类型的字符串集:
<< /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。
答案 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];
}