Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【C#】正規表現でメールアドレス抽出くらいはできるようになりたい!【正規表現】

Unity5.5.0f3 Personal(2016年12月)

f:id:hiyotama:20150504205926p:plain

ひよこエッセンスの時間です〜
今回は正規表現を学びます〜

正規表現でメールアドレス抽出くらいはできるようになりたい!

正規表現は、文字列を検索する時に使われます!
簡単な文字列でしたら,IndexOfメソッドを使えばチェックすることができます!
(IndexOfメソッドは、対象文字列に検索文字列があればその位置Indexを、無ければ-1を返します!)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class SearchString : MonoBehaviour {
	string targetString = "ひよこのたまご";

	void Start () {
		SearchResult("ひよこ");
		SearchResult("さかな");
	}
	
	void SearchResult(string result) {
		if(targetString.IndexOf(result) >= 0){
			Debug.Log("「"+result+"」は「"+targetString+"」に含まれています。");
		}else{
			Debug.Log("「"+result+"」は「"+targetString+"」に含まれてません。");
		}
	}
}

SearchString.cs

しかし、複雑な検索が必要な場合は正規表現を使う必要が出てきます〜

正規表現の勉強は、こちらの、Ruby界隈で有名な伊藤淳一さんのQiitaが最適です!
qiita.com

実例1

例えばメールアドレス!
メールアドレスか判定する条件として、
① @の前に文字が1文字以上
② @の後ろに文字が1文字以上
③ ②の間には.(コロン)が1つ入っている
ひとまずこのような条件で考えてみましょう!

① @の前に文字が1文字以上

文字が1文字は.(コロン)、
直前の文字が1文字以上続くが+(プラス)、
最後に@が来るので・・・

.+@

となります!

② @の後ろに文字が1文字以上

こちらも同様に.+で表現できるので、@の後ろに付けて

.+@.+

となります!

③ ②の間には.(コロン)が1つ入っている

.+と.+の間に.コロンを入れればいいので、

.+@.+\..+

となります!
\(バックスラッシュ)はエスケープシーケンスで、特別な意味を持つ文字列を普通の文字列として扱います!
.(コロン)は正規表現で「なんらかの文字1文字」を意味してしまうので、\を使う必要があります!

最後に正規表現のはじまりを表す^と、終わりを表す$を前後に付けて、

^.+@.+\..+$

完成です!
それでは、以下ソースです〜

using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;

public class SearchString : MonoBehaviour {

	void Start () {
		SearchResult("hiyoko@piyomail.com");
		SearchResult("hiyokopiyomail.com");
		SearchResult("hiyoko@piyomail.co.jp");
		SearchResult("hiyoko@");
		SearchResult("@piyomail.com");
	}


	void SearchResult(string result) {
		if(Regex.IsMatch(
			result,
			@"^.+@.+\..+$",
			RegexOptions.IgnoreCase)){
			Debug.Log("「"+result+"」はメールアドレスです。");
		}else{
			Debug.Log("「"+result+"」はメールアドレスではありません。");
		}
	}
}

SearchString.cs

SearchResultメソッド内で,送られてきた文字列が正規表現にマッチしているか判定しています〜
まずは正規表現を扱うためにSystem.Text.RegularExpressionsライブラリをusingしています!
正規表現は@"〜"の形で書きます〜
Regex.IsMatchは、第一引数に入力した文字列、第二引数にチェックする正規表現が入ります!
第三引数にはオプションで、RegexOptions.IgnoreCaseは「大文字と小文字を分けない」を意味します!

f:id:hiyotama:20161209102858p:plain

結果としては、ちゃんとメールアドレスと判定できました!

実例2

もう少し厳密にメールアドレスをチェックしてみましょう!
④ @の前の文字は半角英数字と「+._-」の記号を許可する
⑤ @の後ろの文字は半角英数字と「-.」の記号を許可する
⑥ ⑤の一番最後は2〜4文字の半角英字で終わる
という条件を付け加えてみます!

④ @の前の文字は半角英数字と「+._-」の記号を許可する

半角英数字を表すためには、or条件と範囲を表す正規表現を行う必要があります!
or条件は[AB]で表します!これで「AもしくはB」を意味します!
範囲は[A-B]で表します!これで「AからBの間」を意味します!
なので、[A-Z0-9]と書けば「AからZもしくは0から9」で、半角英数字を表せます!
それに「+._-」記号を追加すると、

[A-Z0-9+._-]+@

となります!
今回のようにハイフンそのものを判定したい時は、範囲を表さないように一番前か一番後ろに持ってくるのがいいでしょう!

⑤ @の後ろの文字は半角英数字と「-.」の記号を許可する

⑤も④と同じ要領で、半角英数字と「.-」の正規表現を作ると、

[A-Z0-9+._-]+@[A-Z0-9.-]+

となります!
.(コロン)が入っていることで、「 .ne.jp」や「.co.jp」などコロンが2つ以上入った場合にも対処できるようになります!

⑥ ⑤の一番最後は2〜4文字の半角英字で終わる

こちらは文字数を制限する必要があります!
{A,B}で「AからBまでの文字数」と表すことができます!
これを+の位置に書けば、文字数制限が可能です!

[A-Z0-9+._-]+@[A-Z0-9.-]+\.[A-Z]{2,4}

これに^と$を付けて、
^[A-Z0-9+._-]+@[A-Z0-9.-]+.[A-Z]{2,4}$

これでより厳密なメールアドレスの正規表現になりました!

それではソースで確認してみます〜

using System.Collections;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using UnityEngine;

public class SearchString : MonoBehaviour {

	void Start () {
		SearchResult("hiyoko+sns@piyomail.com");
		SearchResult("ひよこ@piyomail.com");
		SearchResult("hiyoko_piyopiyo@piyomail.co.jp");
	}


	void SearchResult(string result) {
		if(Regex.IsMatch(
			result,
			@"^[A-Z0-9+._-]+@[A-Z0-9.-]+.[A-Z]{2,4}$", 
			RegexOptions.IgnoreCase)){
			Debug.Log("「"+result+"」はメールアドレスです。");
		}else{
			Debug.Log("「"+result+"」はメールアドレスではありません。");
		}
	}
}

SearchString.cs

f:id:hiyotama:20161209110032p:plain

実例1だと実はひらがなでもOKだったのですが、こちらではきちんとNGを出しています!


ひとまず正規表現がどんなものかは抑えられたかと思います!
上の伊藤さんの正規表現シリーズはめちゃくちゃので、ぜひ見てみて下さい〜!

初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」 - Qiita
初心者歓迎!手と目で覚える正規表現入門・その2「微妙な違いを許容しつつ置換しよう」 - Qiita
初心者歓迎!手と目で覚える正規表現入門・その3「空白文字を自由自在に操ろう」 - Qiita
初心者歓迎!手と目で覚える正規表現入門・その4(最終回)「中級者テクニックをマスターしよう」」 - Qiita