C#模式搜索

时间:2011-07-09 08:57:19

标签: c# .net linq

下面的代码显示了在文件中搜索特定模式....无论如何,我可以添加到此代码中,以便我可以搜索可能的四种模式。

所以,如果它与第一个不匹配,那么它会查看它是否与第二个相匹配,等等....

非常感谢。

byte[] pattern = new byte[5] { 00, 00, 00, 08, 00 };
byte[] file = File.ReadAllBytes("C:\\123.cfg");

var result = Enumerable.Range(0, file.Length - pattern.Length + 1)
                .Where(i => pattern.Select((b, j) => new { j, b })
                                   .All(p => file[i + p.j] == p.b))
                .Select(i => i + pattern.Length - 1);

int[] PatternArray = result.ToArray();

** * ** * ** * 的** 编辑 * ** * ** * ** * * < /强>

在运行程序时,我插入了一个断点来查看数组存储的内容....这就是它报告的内容

    response    Count = 6   System.Collections.Generic.List<int[]>
    [0] {int[1]}    int[]
         [0]    1577    int
    [1] {int[0]}    int[]
    [2] {int[0]}    int[]
    [3] {int[0]}    int[]
    [4] {int[0]}    int[]
    [5] {int[6]}    int[]
         [0]    31  int
         [1]    246 int
         [2]    448 int
         [3]    663 int
         [4]    864 int
         [5]    1734    int

模式结果似乎都在那里,我是否认为这是一个二维数组? ......如果是这样的话,我可以将它放在一个阵列中吗?

非常感谢

2 个答案:

答案 0 :(得分:3)

创建一个数组(或列表......或其他可枚举的)byte []和一个'匹配'布尔值,然后围绕你的模式搜索做一个while循环:

List<byte[]> patterns = new List<byte[]>()
{ 
    new byte[] { 00, 00, 00, 08, 00 }, 
    new byte[] { 00, 00, 00, 08, 01 }, 
    new byte[] { 00, 00, 00, 08, 02 }, 
    new byte[] { 00, 00, 00, 08, 03 } 
};

//bool matched = false;
foreach (byte[] pattern in patterns)
{
    //while (!matched)
    //{
    byte[] file = File.ReadAllBytes("C:\\123.cfg");

    var result = Enumerable.Range(0, file.Length - pattern.Length + 1)
                    .Where(i => pattern.Select((b, j) => new { j, b })
                                       .All(p => file[i + p.j] == p.b))
                    .Select(i => i + pattern.Length - 1);

    int[] PatternArray = result.ToArray();
    //    if (result != null)
    //        matched = true;
    //}
}

[edit]这是一个以列表形式返回所有有效匹配的函数:

public List<int[]> doPatternSearch()
        {

            List<byte[]> patterns = new List<byte[]>() { 
                new byte[] { 00, 00, 00, 08, 00 }, 
                new byte[] { 00, 00, 00, 08, 01 }, 
                new byte[] { 00, 00, 00, 08, 02 }, 
                new byte[] { 00, 00, 00, 08, 03 } 
                };
            //this becomes a container to hold all of the valid results
            List<int[]> response = new List<int[]>();

            foreach (byte[] pattern in patterns)
            {
                byte[] file = File.ReadAllBytes("C:\\123.cfg");

                var result = Enumerable.Range(0, file.Length - pattern.Length + 1)
                      .Where(i => pattern.Select((b, j) => new { j, b })
                                         .All(p => file[i + p.j] == p.b))
                      .Select(i => i + pattern.Length - 1);

                if (result != null)
                {
                    //if the result is not null then add it to the list.
                    response.Add(result.ToArray<int>());
                }
            }

            return response;

        }

答案 1 :(得分:0)

ORegex可以为你做这件事。在字节序列中进行模式搜索的一个小例子:

var oregex = new ORegex<byte>("{0}{1}{2}", x=> x==12, x=> x==3, x=> x==5);
var toSearch = new byte[]{1,1,12,3,5,1,12,3,5,5,5,5};
                              ^^^^^^   ^^^^^^
var foundTwoMatches = oregex.Matches(toSearch);

您也可以定义IComparable对象并直接传递它,而无需使用labmda函数。

更多示例here