这是一个令人烦恼的问题。我有一段来自 Beyond Compare 脚本报告的文本。
Picture Compare
Produced: 10/17/2012 9:42:25 AM
Ignoring Unimportant
Left file: K:\HDA_FIN\user\JMan\All\A-0001.jpg Right file: K:\HDA_FIN\user\JMan\All\B-0001.jpg
3454945 same pixel(s)
2154 ignored unimportant difference pixel(s)
2741 important difference pixel(s)
当脚本比较文件夹中匹配的 jpeg 时,这会一遍又一遍地重复。但是有些 jpeg 是 100% 相同的,因此它们没有忽略不重要或重要的差异。有些会有相同的差异和重要的差异,但没有不重要的,等等。所以我试图在下一个“图片比较”开始之前捕获以“图片比较”开头并以最后一个“像素”结尾的匹配项再次。
我尝试过的:
我正在做的不是一个丑陋的方法:我使用流阅读器,而 !EndOfStream,我执行 sr.ReadLine() 并将每一行添加到列表中。然后,我使用 for 循环遍历列表并应用一系列 if 语句来确定循环中的当前字符串和接下来的几个字符串是否与我要查找的内容匹配,如果是,我将它们绑定到一个对象。但肯定正则表达式要简单得多。
var lineByLine = new List<string>();
while (!sr.EndOfStream)
{
string line = sr.ReadLine();
sb.AppendLine(line);
if (line.Trim().Length > 0) // && !line.Contains("picture-report layout"))
{
lineByLine.Add(line);
}
}
Contents = sb.ToString();
//get the report blocks
for (int i = 0; i < lineByLine.Count; i++)
{
Block block;
string[] lines = { "", "", "", "", "", "", "" };
//does line contain pic compare? if so, this is the start of an object
if (lineByLine[i].Contains("Picture Compare"))
{
lines[0] = lineByLine[i]; //start line
block = new Block();
lines[1] = lineByLine[i + 1]; //produces
lines[2] = lineByLine[i + 2]; //subheading
if (lineByLine[i + 3].Contains("Left"))
{
lines[3] = lineByLine[i + 3]; //file
if (lineByLine[i + 4].Contains("same pixel(s)"))
{
lines[4] = lineByLine[i + 4]; //same
if (lineByLine[i + 5].Contains("ignored unimportant"))
{
lines[5] = lineByLine[i + 5];
if (lineByLine[i + 6].Contains(" important difference"))
{
lines[6] = lineByLine[i + 6];
}
}
}
else if (lineByLine[i + 4].Contains("ignored unimportant"))
{
lines[5] = lineByLine[i + 4];
if (lineByLine[i + 5].Contains(" important difference"))
{
lines[6] = lineByLine[i + 5];
}
}
else if (lineByLine[i + 4].Contains(" important difference"))
{
lines[6] = lineByLine[i + 4];
}
}
Blocks.Add(new Block(lines[0], lines[1], lines[2], lines[3], lines[4], lines[5], lines[6]));
}
}
}
finally
{
sr.Close();
}
这可行,但我正在尝试重构并使其更清洁。我试过这个:
var matches = Regex.Matches(cr.Contents, "(Picture Compare)(.*?)(pixel)", RegexOptions.IgnoreCase | RegexOptions.Singleline | RegexOptions.ExplicitCapture);
- 但它在所有情况下都停在相同的像素上。我需要更贪婪的东西。有任何想法吗?