2016-11-30 92 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)。