如何将正则表达式与十六进制值匹配?

时间:2017-01-31 18:51:37

标签: c# regex hex

我有这样的文字文件:

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

我有这样的字符串:

4D 5A 02 68 6B 6A

谁与第3行匹配

我使用此代码检查正则表达式路径:

string readdb(string hash)
{
    using (StreamReader sr = new StreamReader("db.txt"))
    {
        string re = string.Format(@"(?<row>\w*:)(?<title>\w*:)({0}:)(?<ep>\w*)", hash);

        String line;
        while ((line = sr.ReadLine()) != null)
        {
            Regex regex = new Regex(re);
            Match match = regex.Match(line);
            if (match.Success)
            {
                return match.Groups[3].Value.ToString();
            }
        }
        return "0";

    }

}

但我的问题??登录档案!
如何匹配任何十六进制值而不是双问号?

1 个答案:

答案 0 :(得分:1)

首先,在Regex regex = new Regex(re);循环之前移动while,您将避免与正则表达式对象娱乐相关的性能问题。

接下来,您似乎需要2个十六进制字符的精确序列 OR 一个双重问号。您可以准备好hash变量,使其与上述方式匹配:

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

regex will look like

(?:4D|\?\?) (?:5A|\?\?) (?:02|\?\?) (?:68|\?\?) (?:6B|\?\?) (?:6A|\?\?)

每个部分匹配2个十六进制字符或2个? s。

查看regex demo