2016-11-30 6 views
0

私は値 "md5:[ここではmd5の値]"を持っています。テキストファイル内のどこからでも値を取得

IE:

File was uploaded successfully, md5: [md5_value_would_be_here] 

私はカントはそれを引っ張る、新しい行に値を書き込むTXTファイルの内容を制御することはできません。

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

だから、正規表現(ノートパッド++はファイル内にいくつかの文字を表示していなかったし、通常のメモ帳で始まりの空白文字をチェックしていないし、末尾の文字をチェックしていた。 "md5:")の出力文字列と私は良いです!ありがとう非常に:) – user2295457

1
としてチートシートをチェックアウトをお勧めしたい、再び

をエスケープされ、閉じ括弧を探します

あなただけ常に(スペースを含む)のテキストmd5:を以下の長さ32、単一の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値がファイル(通常はSequence contains no matching element..)に発見されなかった場合data.First(...)が例外をスローすることがあります。ファイル内に常にMD5があるかどうかわからない場合は、代わりにFirstOrDefault()を使用し、値を抽出する前に何かを返すかどうかを確認します(一致するものが見つからない場合はnullを返します)。

関連する問題