2017-02-04 3 views
1

У меня есть несколько хэшей в этом формате:
Как искать шестнадцатеричный шаблон с дикой картой в строке?

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 68 6B ?? 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"); 
    } 
+0

Это выглядит так, как будто вы хотите использовать * хэш * значение столбца в качестве шаблона регулярного выражения для проверки строки, верно? Просто извлеките его и замените '?' На '.'. –

+0

Да, но hash.Replace ("?", ".") Не работает! – Tavakkoli

+1

Обязательно, * экстракт * хэш первый. 'var pattern = hash.Split (':') [2] .Replace ("? ",". ")', а затем 'Regex.IsMatch (str, pattern)'. –

ответ

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

+0

Из-за большой длины строки, каково ваше предложение улучшить производительность? – Tavakkoli

+0

@ Tavakkoli, можете ли вы описать связь струн с хэшами? например: сопоставление 100 строк с 5 хэшами или 10 строк до 1000 хешей. Различные коэффициенты должны иметь различные наилучшие подходы к оптимизации этого. – Mobigital

+0

моя строка - это содержимое двоичного файла, и я ищу хэш в этом контенте. – Tavakkoli

 Смежные вопросы

  • Нет связанных вопросов^_^