正規表現とは、「文字列の集まりを一つの形式の文字列で表現する方法」です。
たとえば、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ではありません。");
}
実行結果です。
![](https://csharp.nomux2.net/wp-content/uploads/2023/04/image-25.png)
正規表現を使った文字列検索
正規表現を使って文字列を検索することができます。
例えば、以下のソースコードは文章の中から英字を抜き出します。
string dummy = @"Commonsも文字事典で括弧ある目的んあるため、受信され日本語を剽窃権明確の投稿本文に限られてはするませ、predominantlyのペディアは、著作さ対象を引用することに従って紛争公正ますでていうな。しかし、未然の著作毎は、フェアの引用あり利用独自で対象が執筆含む、その要件でするば方針と引用しことと創作されある。またはを、提出方針が著作得るれとおくFreeが決してささことは、留意でで、過去によるは投稿性の手続によりユース上の問題は生じることを、被削除者は、独自の説明がありて字を推奨なっないていでで。担保さて、これらの管理はないでもさでませ。しかし、被関係法を、推奨する権利の対象、フレーズを公式に著作さことにできるて、要件ライセンスの許諾と方針を引用できことが得るて、保護するで資料を引用、:権列挙なけれんとの漏洩にさことは、まず難しいとするてよいますある。";
string pattern = @"[a-zA-Z]+"; //正規表現
foreach(var match in Regex.Matches(dummy, pattern))
{
Console.WriteLine(match);
}
実行結果です。
![](https://csharp.nomux2.net/wp-content/uploads/2023/04/image-26.png)
正規表現を使った文字列置換
正規表現をつかって文字を置換することもできます。これが結構便利です。
先日CDから音楽をmp3に変換したんですが、ファイル名が以下のようにトラックになってしまいました。
![](https://csharp.nomux2.net/wp-content/uploads/2023/04/image-27.png)
これをスマホに入れて聞こうと思ったのですが、文字コードが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);
}
![](https://csharp.nomux2.net/wp-content/uploads/2023/04/image-28.png)
ここで検索用に使用した正規表現は「([0-9]+).+\s([0-9]+)\.mp3」、置換用に使った正規表現は「$1-track$2.mp3」です。()を使うとグループ化され先頭から$1、$2・・・で置換の時に利用できるようになります。
いろんなパターン
さまざまなパターンを紹介します。
種類 | パターン |
---|---|
URL | https?://[\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#という話から逸れていくと考えたからです。
この記事が皆様のお役に立てたら幸いです。
コメント