2014/10/12

【C#】正規表現で一致した部分だけを取得する

正規表現で一致したかどうか判定するには、Regex.IsMatchのように割りと簡単にできる。
しかし、一致した箇所を取得するとなるとちょっと面倒。

その方法をまとめる。



正規表現で一致した部分だけを取得する



たとえば、htmlファイルから <h1> の見出しを取得したい場合、以下のような実装になる。

using System.IO;
using System.Text;
using System.Text.RegularExpressions;

string path = @"C:\test.html";

// ↓ ココの(?<head1>.*?)の部分が取得箇所
var head = new Rexeg(@"<h1>(?<head1>.*?)</h1>"
                    ,RegexOption.IgnoreCase | RegexOption.Singleline);

foreach (var line in File.ReadAllLine(path, Encoding.UTF8))
{
    var h = head.Match(line);
    if (h.Success) 
    {
        // Groups["head1"]の"head1"は、上記で書いた(?<head1>.*?)の名前
        Console.WriteLine("見出し:{0}", h.Groups["head1"].Value);
    }
}

8、9行目で指定している「"<h1>(?<head1>.*?)</h1>"」が正規表現のパターン。

それ使って「head.Match(line)」で一致した結果を取得している。
取得できたかどうかは「if (h.Success)」で判定が可能。

取得できていればあとは「h.Groups["head1"].Value」で取得したい部分(head1)を指定して取得すればOK。


Tipsとして、C# 2.0からはStreamReaderを使わなくても「File.ReadAllLines」と書くだけで、ファイルのすべての行を文字列配列として読み込むことができる。
もちろん読み取ったあとは、勝手にファイルを閉じてくれる便利なヤツ!


全部読み取るとメモリがヤバイってときは、1行ずつ読み取ってくれるStreamReaderのほうが良いかもしれないけど、ほんのちょっとのファイルならReadAllLinesで十分。


 

参考


以上

written by @bc_rikko

0 件のコメント :

コメントを投稿