2016-11-30 42 views
0

我有一个值“md5:[md5 value here]”,它出现在文本文件中大约15行的中间。从文本文件中的任意位置获取值

IE:

File was uploaded successfully, md5: [md5_value_would_be_here] 

我有过txt文件内容没有控制,使倾斜值写入一个新行,然后把它。 (我知道在批处理中,我可以使用查找和替换,但完全消除了如何在C#中执行它)。如何获取md5的值:

任何帮助表示赞赏:)

继承人,我使用的是什么,到目前为止...

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; 
      } 
+2

该代码有什么问题?你的文件的一个例子可能在这里非常有用。 – Steve

+2

你提供的例子并不包含一个'=',但这就是你用来分割线条的东西。 –

+0

为什么把'()'放在正则表达式中? –

回答

5

可能最简单的方法是使用Regex。首先我可能将整个文件读入一个字符串:

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; 
} 

这使得你是哈希包含的假设:

String content = File.ReadAllText()

然后,你可以沿着以下线使用的东西大写字母,小写字母和数字。它的工作原理是这样的:

md5: - 从字面上查找md5:开始匹配

\[ - 寻找一个开放式托架,该\用于逃避

(...) - 创建匹配组,位在这里匹配将在m.Groups[1]使访问结果更容易。

[a-zA-Z0-9]* - 这是说匹配任何字母字符或数字的很长的路要走。请注意,*意味着匹配其中的许多,没有它,它只会拾取第一个字符。

\] - 只需寻找闭括号,再次被转义

如果您需要了解更多的正则表达式的信息,帮助您修改捕获,我只是建议您检查出一张小抄如Regexlib.com

+0

感谢您的支持!但是,如果括号是空格,那么正则表达式会是什么? \ s? – user2295457

+0

@ user2295457方括号'['和']'?只需将它们与模式中的空格互换即可。空格在字面上被当作空格对待,实际上你可以在'md5:\ ['里面看到空格。 '('和')'括号需要在那里创建正则表达式匹配组,它们是特殊字符,它不会**查找原始字符串中的那些字符,因此您可以忽略它们。 – Ian

+0

好吧,所以得到它,是正则表达式(记事本+ +没有显示文件中的一些字符,检查与普通记事本reviealed没有起始空间字符,并=尾随......只需要从左边修剪4个字符“md5:”)在我的输出字符串,我很好!非常感谢:) – user2295457

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); 

这个我这是相当明确的,而且应该希望完全不言自明。

有一点要注意,虽然:data.First(...)可能会抛出异常,如果没有MD5值的文件(通常Sequence contains no matching element..)中找到。如果您不确定文件中是否始终存在MD5,请使用FirstOrDefault()代替,并在尝试提取值之前检查它是否返回任何内容(如果未找到匹配,它将返回null)。