如何在字符串中使用通配符搜索十六进制模式?

时间:2017-02-04 20:17:54

标签: c# regex hex

我有一些这种格式的哈希:

row:title:hash:flag
1:upx1:4D 00 68 6B ?? 68 6A:True
2:upx2:68 6B ?? 68 6A 00 02:False
3:upx3:FF 4D ?? 68 6B ?? 68:True

我有这样的字符串:

02 4D 00 68 6B 6A 68 6A 00 02 00 00 00 FF 02 5A 68 6B 6A 68 6A 00 02 00

我需要匹配任何带有此字符串的散列并匹配任何十六进制值而不是双重问号
例如,行1“4D 00 68 6B ?? 68 6A”中的散列与我的字符串

匹配

我使用此代码但总是返回“否”

    string str = "02 4D 00 68 6B 6A 68 6A 00 02 00 00 00 FF 02 5A 68 6B 6A 68 6A 00 02 00";
    string hash = "1:upx1:4D 00 68 6B ?? 68 6A:True";

    str = string.Join(" ", str.Split().Select(x => string.Format(@"(?:{0}|\?\?)", x)).ToArray());
    string sPattern = string.Format(@"(?<row>\w*:)(?<title>\w*:)([^:]*{0}[^:]*:)(?<ep>\w*)", hash);


    if (Regex.IsMatch(str, sPattern))
    {
        MessageBox.Show("ok");
    }
    else
    {
        MessageBox.Show("no");
    }

1 个答案:

答案 0 :(得分:1)

您不希望整行与字符串匹配,因为字符串不适合该行。这是一个如何做的工作示例:

 public static void Test()
 {
       string str = "02 4D 00 68 6B 6A 68 6A 00 02 00 00 00 FF 02 5A 68 6B 6A 68 6A 00 02 00";
        string hash = "1:upx1:4D 00 68 6B ?? 68 6A:True";
        var parts = hash.Split(':');
        string title = parts[1];
        string hashhex = parts[2];
        string sPattern = hashhex.Replace("?", ".");
        Console.WriteLine($"Pattern={sPattern}");
        Console.WriteLine($"String={str}");

        if (Regex.IsMatch(str, sPattern))
        {
            Console.WriteLine("ok");
            Console.WriteLine($"MatchedTitle={title}");
        }
        else
        {
            Console.WriteLine("no");
        }
        Console.ReadLine();
 }

这是输出:

enter image description here