正規表現(Regular Expression / Regex)は、一言で言うと「文字列の中にある特定のパターンを効率よく探したり、置換したりするための『魔法の記号』」です。
プログラミングやテキストエディタ(VS Codeなど)での検索、Excelのデータ整理などで非常によく使われます。
よく使う「魔法の記号」まとめ
| 記号 | 意味 | 例 | マッチする例 |
|---|---|---|---|
. | 任意の1文字 | あ.い | あい、あおい、あ1い |
^ | 行の先頭 | ^こんにちは | 「こんにちは」から始まる行 |
$ | 行の末尾 | です$ | 「です」で終わる行 |
* | 直前の文字が0回以上繰り返し | あ*い | い、あい、あああい |
+ | 直前の文字が1回以上繰り返し | あ+い | あい、あああい(「い」だけはNG) |
? | 直前の文字が0回か1回 | りんご? | りん、りんご |
[] | カッコ内のいずれかの1文字 | [ABC] | A または B または C |
\d | 数字(0-9) | \d\d | 12、99(2ケタの数字) |
具体的な使い方のイメージ
電話番号を探す
日本の電話番号(例:090-1234-5678)を探したい場合、こんな風に書けます。
\d{3}-\d{4}-\d{4}
文末の「。」を「!」に変える
文章全体の中から、文末の句点だけをビックリマークに変えたいときは、置換機能で
。$ をターゲットにします。
・・・正規表現はなかなか覚えられないので、その都度調べています。
Flutter(Dart)での書き方
メールアドレスとして正しい形をしているか?の判定の場合
// 1. パターンを定義する(メールアドレスとして正しい形をしているか?)
final emailRegex = RegExp(r'^[a-zA-Z0-9.]+@[a-zA-Z0-9]+\.[a-zA-Z]+');
// 2. チェックしたい文字列
String email = "[email protected]";
// 3. 判定する(マッチするかどうか)
bool isValid = emailRegex.hasMatch(email);
print(isValid); // true
この1番の意味
r’^[a-zA-Z0-9.]+@[a-zA-Z0-9]+.[a-zA-Z]+’ の解読図
この式は大きく 5つのブロック に分かれています。
- ^・・・意味: 行の先頭からスタート。余計な文字が前にくっついていないことを保証します。
- [a-zA-Z0-9.]+
意味: 英小文字(a-z)、英大文字(A-Z)、数字(0-9)、ドット(.) のいずれかが 1文字以上(+) 続く。
いわゆるメールの「ユーザー名」の部分です。 - @・・・意味: そのままアットマークがあること。
- [a-zA-Z0-9]+
意味: 英数字が 1文字以上(+) 続く。
「gmail」や「yahoo」などのドメイン名の一部です。 - .
意味: ドット(.) そのもの。 - 正規表現で . は「なんでもいい1文字」という意味なので、ただのドットとして扱いたいときは \ をつけて打ち消します(エスケープ)。
- [a-zA-Z]+
意味: 英字が 1文字以上(+) 続く。
「com」や「jp」などの末尾部分です。
この正規表現が「合格」にする例・「不合格」にする例
このルールに当てはめると、プログラムは以下のように判定します。
⭕ 合格 (Match)
[email protected]
[email protected]
❌ 不合格 (No Match)
test@example(最後の .com などがない)
[email protected](@ と . の間に文字がない)
あいうえお@example.com(日本語は許可していない)
ポイント1: r をつける
Dartで正規表現を書くときは、文字列の前に r をつけるのが一般的です(Raw Stringといいます)。
これをつけることで、バックスラッシュ(\)をそのまま正規表現の記号として扱えるようになり、エラーを防げます。
なぜ r (Raw String) が必要なのか?
通常、プログラミングでは \n は「改行」を意味してしまいます。
r’\n’ → そのまま \n という2文字として扱う
‘\n’ → 改行(見えない改行コード)として扱う
正規表現では \d(数字)のようにバックスラッシュを多用するため、r をつけないとコンピュータが混乱してしまい、意図しない挙動になるのを防ぐためです。
ポイント2: RegExp というクラスが用意されている
「Dart」では、正規表現を扱うために RegExp というクラスが用意されています。
よく使うメソッド3選
RegExp クラスを作った後に、よくセットで使われるメソッドです。
- hasMatch(string): パターンに合っているか(true/false)
- firstMatch(string): 最初に一致した部分を取り出す
- allMatches(string): 一致した箇所をすべて取り出す
文字列の置換の場合
例: String phone = ‘090-1234-5678’; からハイフンを消して 09012345678 にしたい場合。
String cleanPhone = phone.replaceAll(RegExp(r'-'), '');
大文字小文字を無視したいとき
RegExp のオプション引数を使います。
RegExp のオプション引数を使います。
まとめ
正規表現には「PHP系」「JavaScript系」などいくつかの「方言」がある。
Dartの正規表現は JavaScript系
複雑な正規表現をコピーしてくる場合は、「JavaScriptで動くもの」を探せば、
Flutterでもそのまま動く可能性が非常に高い
おまけ:
メールアドレスの規格はもっと複雑で、記号の制限などが厳しく決まっています。
実際では「メールアドレス用正規表現」をネットから拾ってきて使うのがいいかも!
