正規表現について

文字列

正規表現とは、「文字列の集まりを一つの形式の文字列で表現する方法」です。

たとえば、WebサイトのURLなどが正しいかどうかチェックすることができます。
つまり、文字の集まり(WebサイトのURL)が、一つの形式の文字列で表現されているか(URLとして成り立っているか)を調べるということです

C#で正規表現を使う場合、「System.Text.RegularExpressions」のnamespaceを使います。ちょっと長いのでusingしておきます。

using System.Text.RegularExpressions;

正規表現を使った文字列チェック

対象の文字列が、正規表現のルールで表現されているかをチェックします。例えばURLが正しいものかどうかやメールアドレスが正しいかなどのチェックで利用できます。

以下のソースはURLのチェック例です。

string url1 = @"https://www.yahoo.co.jp/";  //チェック対象のURL1
string url2 = @"http//www.yahoo.co.jp/";    //チェック対象のURL2

string pattern = @"https?://[\w!\?/\+\-_~=;\.,\*&@#\$%\(\)'\[\]]+"; //URLを表す正規表現

if (Regex.IsMatch(url1, pattern) == true)
{
    Console.WriteLine($"{url1}はURLです。");
}
else
{
    Console.WriteLine($"{url1}はURLではありません。");
}


if (Regex.IsMatch(url2, pattern) == true)
{
    Console.WriteLine($"{url2}はURLです。");
}
else
{
    Console.WriteLine($"{url2}はURLではありません。");
}

実行結果です。

正規表現を使った文字列検索

正規表現を使って文字列を検索することができます。
例えば、以下のソースコードは文章の中から英字を抜き出します。

string dummy = @"Commonsも文字事典で括弧ある目的んあるため、受信され日本語を剽窃権明確の投稿本文に限られてはするませ、predominantlyのペディアは、著作さ対象を引用することに従って紛争公正ますでていうな。しかし、未然の著作毎は、フェアの引用あり利用独自で対象が執筆含む、その要件でするば方針と引用しことと創作されある。またはを、提出方針が著作得るれとおくFreeが決してささことは、留意でで、過去によるは投稿性の手続によりユース上の問題は生じることを、被削除者は、独自の説明がありて字を推奨なっないていでで。担保さて、これらの管理はないでもさでませ。しかし、被関係法を、推奨する権利の対象、フレーズを公式に著作さことにできるて、要件ライセンスの許諾と方針を引用できことが得るて、保護するで資料を引用、:権列挙なけれんとの漏洩にさことは、まず難しいとするてよいますある。";

string pattern = @"[a-zA-Z]+"; //正規表現

foreach(var match in Regex.Matches(dummy, pattern))
{
    Console.WriteLine(match);
}

実行結果です。

正規表現を使った文字列置換

正規表現をつかって文字を置換することもできます。これが結構便利です。

先日CDから音楽をmp3に変換したんですが、ファイル名が以下のようにトラックになってしまいました。

これをスマホに入れて聞こうと思ったのですが、文字コードがWindowsはSJISでスマホはUTF-8でした。そのため文字化けしてしまいました。なのですべてのファイルを「99-Track99.mp3」形式で変更しようと思います。

//フォルダ名
string dir = @"C:\Users\misoy\Music\CD";

//正規表現パターン
string pattern = @"([0-9]+).+\s([0-9]+)\.mp3";

//RegExオブジェクトを作成
System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(pattern);

//指定フォルダにあるmp3ファイルを取得する
foreach (string file in System.IO.Directory.GetFiles(dir, "*.mp3"))
{
    string file_name = System.IO.Path.GetFileName(file);        //ファイル名を取得
    string file_dir = System.IO.Path.GetDirectoryName(file);    //フォルダ名を取得

    //正規表現を使って新しいファイル名を生成
    string new_file_name = regex.Replace(file_name, "$1-track$2.mp3");

    //変更先のファイル名を生成
    string new_file = $"{file_dir}\\{new_file_name}";

    //名前変更処理
    System.IO.File.Move(file, new_file);

}

ここで検索用に使用した正規表現は「([0-9]+).+\s([0-9]+)\.mp3」、置換用に使った正規表現は「$1-track$2.mp3」です。()を使うとグループ化され先頭から$1、$2・・・で置換の時に利用できるようになります。

いろんなパターン

さまざまなパターンを紹介します。

種類パターン
URLhttps?://[\w!\?/\+\-_~=;\.,\*&@#\$%\(\)’\[\]]+
メールアドレス^[a-zA-Z0-9_.+-]+@([a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]*\.)+[a-zA-Z]{2,}$
固定電話^0([0-9]-[0-9]{4}|[0-9]{2}-[0-9]{3}|[0-9]{3}-[0-9]{2}|[0-9]{4}-[0-9])-[0-9]{4}$
携帯電話^0[789]0-[0-9]{4}-[0-9]{4}$
郵便番号(ハイフンあり)^[0-9]{3}-[0-9]{4}$

まとめ

C#で正規表現を使った処理を紹介しました。あえて正規表現の細かい説明はしませんでした。他のサイトで詳しく説明しているところがたくさんあるので、そちらを見たほうがよいかと思ったことと、C#という話から逸れていくと考えたからです。

この記事が皆様のお役に立てたら幸いです。

コメント

タイトルとURLをコピーしました