C# の正規表現を覚える。

普段はJava、Groovyや、
他にはスクリプト言語ばっかり使っていたので、久しぶりにC# を使うと忘れている。

...というか、IDEAですべてできたらいいのになと、思ってしまう。

C# (C-Sharp) での正規表現。
忘れておったので、ブログに残しておくかぁ。

Regex クラス

Regex というクラスのインスタンスを使って判定すればOK。

// 8桁の半角数字を含む文字列か判定
var regex = new Regex(@"^.*~(\d{8}).*$", RegexOptions.IgnoreCase);
bool ret  = regex.IsMatch("hoge20170504.xlsx");
// ===> True

@(アットマーク)で始まるリテラルは、\などのエスケープ文字を暗黙的にエスケープしてくれている。

マッチする文字列を抽出したい。

先程の数字の部分だけ抽出したい場合は、Matchesメソッドを使う。

var regex   = new Regex(@"^.*~(\d{8}).*$", RegexOptions.IgnoreCase);
var matches = regex.Matches("hoge20170504.xlsx");

if (0 < matches.Count){
    Console.WriteLine( matches[0].Groups[0] ); // マッチした文字列全体
    // ===> hoge20170504.xlsx

    Console.WriteLine( matches[0].Groups[1] ); // 1つめの括弧で囲った部分にマッチ文字列
    // ===> 20170504
}

ファイル一覧

正規表現にマッチするファイル名の一覧を取得する関数を作ってみる。

public static IList<string> GetFileNames(string dirPath, Regex regex)
{
    IList<string> nameList = new List<string>();
    if (!Directory.Exists(dirPath)) return nameList;

    string[] files = System.IO.Directory.GetFiles(dirPath);
    foreach (var filePath in files)
    {
        string fileName = Path.GetFileName(filePath);
        if (regex.IsMatch(fileName)) nameList.Add(fileName);
    }
    return nameList;
}
IList<string> fileNames = GetFileNames(@"C:\Users\tyabuta\Desktop", 
                                       new Regex(@"^2017.*\.xlsx$");

foreach (var fileName in fileNames) {
    Console.WriteLine(fileName);
}

2017から始まる.xlsxファイルの一覧を取得する事ができる。
ワイルドカードと違って、正規表現なので、少し複雑な抽出も可能だ。


ちなみに、
WP Code Highlight.js をつかっているが、
C#のシンタックスハイライトはトリプルバッククォートのあとに"cs"と指定するみたい。

コメントを残す