43841


C#でテキストファイルから5文字以上の数字があれば読み込みその前後10文字と数字を抜き出したいのですが、うまくいきません。。

[code]

    string file = textBox1.Text;
    string pattern_count = @"[0-9]{5,}";
    
    IEnumerable<string> files =System.IO.Directory.EnumerateFiles(@file, "*", System.IO.SearchOption.AllDirectories);
    
    
    foreach (string f in files)
    {
    
        StreamReader sr = new StreamReader(f, Encoding.GetEncoding("Shift_JIS"));
        string str = sr.ReadToEnd();
        sr.Close();
    
        if (str.Contains(pattern_count))
        {
    
            System.Text.RegularExpressions.Regex r =new  System.Text.RegularExpressions.Regex(@pattern_count ,System.Text.RegularExpressions.RegexOptions.IgnoreCase);
            System.Text.RegularExpressions.MatchCollection m = r.Matches(f);
    
            while (m.Success)
            {
                Console.WriteLine(m.Value);
                m = m.NextMatch();
            }                                      
    
        }
    
    }
    
[/code]


CC BY-SA 4.0
2018-05-07T11:46:23.683
43838
2018-05-07T12:31:12.220
2018-05-07T11:53:05.617
4236
28442
question
c# 正規表現
C#で文字列の抽出


> その前後10文字と数字を抜き出したい

[Matchクラス](https://msdn.microsoft.com/ja-
jp/library/system.text.regularexpressions.match\(v=vs.110\).aspx)にはIndexプロパティとLengthプロパティがあります。これらを使用することで、元文字列のどの位置がマッチしたのかを知ることができます。これを利用すれば実現できると思います。

[code]

    foreach (string file in Directory.EnumerateFiles(textBox1.Text, "*", SearchOption.AllDirectories)) {
        var str = File.ReadAllText(file, Encoding.GetEncoding("Shift_JIS"));
        foreach (Match m in Regex.Matches(str, "[0-9]{5,}")) {
            var begin = Math.Max(m.Index - 10, 0);
            var end = Math.Min(m.Index + m.Length + 10, str.Length);
            Console.WriteLine(str.Substring(begin, end - begin));
        }
    }
    
[/code]

オフセット計算が間違っていたらすみません（’’


CC BY-SA 4.0
2018-05-07T12:09:17.993
43841
2018-05-07T12:09:17.993
4236
43838
answer


質問のコードがコンパイルできないのは

>
[code]

>        System.Text.RegularExpressions.MatchCollection m = r.Matches(f);
>  
>         while (m.Success)
>         {
>             Console.WriteLine(m.Value);
>             m = m.NextMatch();
>         }
>  
[/code]

でマッチに使用している`Regex.Matches`メソッドと繰り返し処理で使用している`while (m.Success) ～ m =
m.NextMatch();`の方針が一致していないからです。つまり`Matches`の戻り値は`MatchCollection`ですが、下のループは`m`が`Match`型であることを想定したアルゴリズムになっています。

ですので`Matches`メソッドと`m`の型を`Match`に変更するか、`Matches`の戻り値を`foreach`で処理するかに統一する必要があります。

[code]

    Match m = r.Match(f);
    
[/code]

また上記以前にも不具合があります。

>
[code]

>     if (str.Contains(pattern_count))
>  
[/code]

この`pattern_count`は正規表現ですが、`String.Contains`は単純に文字列として検索をするため、数字5文字ではこの条件を満たしません。この分岐は単純に削除して正規表現に任せればよいでしょう。


CC BY-SA 4.0
2018-05-07T12:31:12.220
43842
2018-05-07T12:31:12.220
5750
43838
answer