今回は、C#で学ぶ初めての正規表現です。
C#の勉強がてら、ちょっとしたバリデーションを作って正規表現について学んでいきます。
C#はWEBアプリ、デスクトップアプリ、スマホアプリ、組み込みetcと、実質なんでも作れる汎用プログラミング言語です。
勉強しとくと色々面白いものが作れるかなと思って最近勉強をはじめたばりばり初心者です。
教材はこれ使ってます。
定番の独習シリーズ。
そんなC#で今回は、パターンマッチングで文字列を指定できる便利な正規表現について学習していきます。
もくじ
正規表現とは
正規表現とは、文字列内で文字の組み合わせを照合するために用いられるパターンです。
正規表現についての詳細は割愛します。
詳しくはこちらの記事が分かりやすかったです。
深く学びたい人はこちらをどうぞ。
オライリー本です。
ではさっそく、C#で正規表現を使ったバリデーションを実装してみましょう。
C#のコマンドラインで入出力
まずはバリデーションの前に、ユーザーの入力を受け付けて出力するコンソールアプリを用意します。
とりあえずシンプルなオウム返しアプリです。
static void Main(string[] args) { while (true) { Console.Write("8文字以上の数字を入力してね: "); var key = Console.ReadLine(); Console.Write(key + "nn"); } }
ここで入力された値に対するバリデーション機能を正規表現で実装していきます。
C#でパターンマッチング
C#で正規表現によるパターンマッチングを行うためには、RegexクラスのIsMatchメソッドを利用します。
さっそくimportからしていきましょう。
using System.Text.RegularExpressions;
では、手始めに8個以上の数字が入力されたかどうかを判定し、正しい場合はオウム返し、誤っていた場合はFalseと返すようにしてみます。
この条件をIfやSwitchで書こうと思うと非常に大変ですよね。
ですが、正規表現を使えばとても簡単に書くことができます。
では、コードを見てみましょう。
static void Main(string[] args) { while (true) { var rgx = new Regex("[0-9]{8,}"); Console.Write("8文字以上の数字を入力してね: "); var key = Console.ReadLine(); Console.Write(rgx.IsMatch(key)?key+"nn": "Falsenn"); } }
このコードを実行すると、このようになります。
8文字以上の数字を入力してね: 12345678 >12345678 8文字以上の数字を入力してね: 1234567 >False 8文字以上の数字を入力してね: aaaaaaaa >False 8文字以上の数字を入力してね: 1234abcd >False 8文字以上の数字を入力してね: 12345678910 >12345678910
数字以外が混ざっている場合や、8文字に満たない場合はFalseが返ってきてますね。
実はこの条件、たったの [0-9]{8,} だけで表すことができるのです。
この式が意味するのは、『0~9の中の数字( [0-9] )が、8個以上連続( {8,} )して続く』です。
面白いですね。
では、他にどのような意味を持つ正規表現があるのか見てみましょう。
基本的な正規表現
・繰り返し、行頭を表す記号
. 任意の1文字を表す
+ 直前の文字の1個以上の繰り返しと一致
* 直前の1文字の0回以上の繰り返しと一致
? 直前の文字の0または1文字と一致
つまり、次のような任意の文字の文字の一個以上の繰り返しは任意の文字列を表します。
.+ 任意の文字列
^ 行の先頭
$ 行の末尾
つまり、一文字目がa、最後の文字がz真ん中は任意の文字列の場合、次のように表します。
^[a].*[z]$
少しややこしくなってきましたね。
このパターンマッチングを、先ほどのC#のコードで動かしてみましょう。
aで始まりzで終わる文字列: az >az aで始まりzで終わる文字列: a3fs32z >a3fs32z aで始まりzで終わる文字列: abcde >False aで始まりzで終わる文字列: jffwfz >False
うまくいってますね。
このように、正規表現を使うと複雑な文字列の条件をたった一行で表せるようになるのです。
他の種類もいくつか見ていきましょう。
・カッコで表す正規表現
[ ] カッコ内の任意の1文字と一致「-」で範囲を指定できる
[a-z] 小文字のアルファベット1文字と一致
[^ ] カッコ内の任意の1文字と不一致「-」で範囲を指定できる
[^A-Z] 大文字のアルファベット以外
{ } カッコ内の数値の繰り返しと一致
{n} 直前の文字のn個の繰り返しと一致
{,n} 直前の文字のn個以下の繰り返しと一致
{m,} 直前の文字のm個以上の繰り返しと一致
{m,n} 直前の文字のm個以上、n個以下の繰り返しと一致
冒頭で書いた8文字以上の数字を表す正規表現は、これらを使って書かれています。
0から9までの数字を表す[0-9]に、直前の文字のm個以上の繰り返しと一致する{8,}を書き足し、任意の数字が8個以上続く、という正規表現にしています。
まとめ
いかがでしたか?
正規表現は慣れない記法ですので、少しとっつきにくいですが、とても便利というのが分かっていただけたかと思います。
正規表現は、スクレイピングやファイル処理など、膨大な文字列を処理する場合などにもパワーを発揮します。
ぜひ、一緒に覚えていきましょう。
参考
【C#入門】正規表現の使い方総まとめ(Match/Matches/Replace)
おすすめ教材です!
独習C#