しかし、一致した箇所を取得するとなるとちょっと面倒。
その方法をまとめる。
正規表現で一致した部分だけを取得する
たとえば、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で十分。
参考
- Regex クラス (System.Text.RegularExpressions)
- Match クラス (System.Text.RegularExpressions)
- File.ReadAllLines メソッド (System.IO)
以上
written by @bc_rikko
0 件のコメント :
コメントを投稿