我有一个值“md5:[md5 value here]”,它出现在一行中间大约15行到文本文件中。
IE:
File was uploaded successfully, md5: [md5_value_would_be_here]
我无法控制txt文件内容,因此无法将值写入新行,然后将其拉出来。
在c#中,我将如何获得md5的值:(我知道批量生产我可以使用查找和替换,但完全消除了如何在c#中执行此操作)。
任何帮助表示赞赏:)
到目前为止,我正在使用的是什么...var data = File
.ReadAllLines("file.txt")
.Select(x => x.Split('='))
.Where(x => x.Length > 1)
.ToDictionary(x => x[0].Trim(), x => x[1]);
string serverFileMD5 = data["md5"];
由于
更新
以下未取得成功,
String data = File.ReadAllText("File.txt");
String pattern = "md5: ([a-zA-Z0-9]*) ";
Regex reg = new Regex(pattern);
Match m = reg.Match(data);
if (m.Success)
{
Group g = m.Groups[1]; // This should be the hash
Console.WriteLine("value of g: " + g);
serverFileMD5 = g.Value;
}
答案 0 :(得分:5)
可能最简单的方法是使用Regex。首先,我可能会将整个文件读成一个字符串:
String content = File.ReadAllText()
然后你可以使用以下几行:
String pattern = "md5: \[([a-zA-Z0-9]*)\]";
Regex reg = new Regex(pattern);
Match m = reg.Match(content);
if(m.Success) {
Group g = m.Groups[1]; // This should be the hash
String hash = g.Value;
}
这假设您的哈希包含大写字符,小写字符和数字。它的工作原理如下:
md5:
- 字面上查找md5:
以启动匹配
\[
- 查找空心括号,\
用于转义
(...)
- 创建匹配组,此处匹配的位将位于m.Groups[1]
中,以便更轻松地访问结果。
[a-zA-Z0-9]*
- 这是说匹配任何字母字符或数字的漫长道路。请注意,*
表示匹配其中的许多,没有它,它只是拾取第一个字符。
\]
- 只需寻找一个关闭括号,再次进行转义
如果您需要有关Regex的更多信息来帮助您修改捕获,我建议您查看备忘单,例如Regexlib.com
答案 1 :(得分:1)
假设你只想找到一个长度为32的MD5哈希值,它始终跟在文本md5:
之后(包括空格),这个简单的解决方案就足够了:
var data = File.ReadAllLines(@"C:\somewhere\DummyTextWithHash.txt");
var lineWithMd5 = data.First(line => line.Contains("md5: "));
var md5StartPos = lineWithMd5.IndexOf("md5:").Dump();
var md5Value = lineWithMd5.Substring(md5StartPos + 5, 32);
这是相当明确的,并且应该完全不言自明。
有一点需要注意:如果文件中没有找到MD5值({em> data.First(...)
),Sequence contains no matching element..
可能会抛出异常。如果您不确定文件中是否始终存在MD5,请在其中使用FirstOrDefault()
,并在尝试提取值之前检查它是否返回任何内容(如果该值将返回null
,则没找到匹配)。