我有这样的文字文件:
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";
}
}
但我的问题??登录档案!
如何匹配任何十六进制值而不是双问号?
答案 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);
(?:4D|\?\?) (?:5A|\?\?) (?:02|\?\?) (?:68|\?\?) (?:6B|\?\?) (?:6A|\?\?)
每个部分匹配2个十六进制字符或2个?
s。
查看regex demo。