-1

这是一个令人烦恼的问题。我有一段来自 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);

- 但它在所有情况下都停在相同的像素上。我需要更贪婪的东西。有任何想法吗?

4

2 回答 2

2

您可以尝试找到下一个开始,而不是找到结束:

@"Picture Compare(?:(?!Picture Compare).)*"

这匹配Picture Compare然后尽可能多的字符,只要它们不开始一个新的Picture Compare(这就是负前瞻的目的)。这应该只是给你所有这些块。

然后在每个块上,您可以进行更简单的扫描以获取您感兴趣的值(不幸的是,我不知道哪些是,否则我可能还有另一个正则表达式:P)。

于 2012-10-29T20:43:34.373 回答
0

尝试使用正则表达式模式

Picture Compare\n?(?:(?!Picture Compare)[^\n]*\n?)*

所以你阅读了行Picture Compare和所有以下不以开头的行Picture Compare

于 2012-10-29T20:51:31.707 回答