Flutter初心者のための正規表現のポイント

正規表現(Regular Expression / Regex)は、一言で言うと「文字列の中にある特定のパターンを効率よく探したり、置換したりするための『魔法の記号』」です。

プログラミングやテキストエディタ(VS Codeなど)での検索、Excelのデータ整理などで非常によく使われます。

目次

よく使う「魔法の記号」まとめ

記号意味例マッチする例
.任意の1文字あ.いあい、あおい、あ1い
^行の先頭^こんにちは「こんにちは」から始まる行
$行の末尾です$「です」で終わる行
*直前の文字が0回以上繰り返しあ*いい、あい、あああい
+直前の文字が1回以上繰り返しあ+いあい、あああい(「い」だけはNG)
?直前の文字が0回か1回りんご?りん、りんご
[]カッコ内のいずれかの1文字[ABC]A または B または C
\d数字(0-9)\d\d12、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(日本語は許可していない)

Dartで正規表現を書くときは、文字列の前に r をつけるのが一般的です(Raw Stringといいます)。
これをつけることで、バックスラッシュ(\)をそのまま正規表現の記号として扱えるようになり、エラーを防げます。

なぜ r (Raw String) が必要なのか?


通常、プログラミングでは \n は「改行」を意味してしまいます。
r’\n’ → そのまま \n という2文字として扱う
‘\n’ → 改行(見えない改行コード)として扱う

正規表現では \d(数字)のようにバックスラッシュを多用するため、r をつけないとコンピュータが混乱してしまい、意図しない挙動になるのを防ぐためです。

「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でもそのまま動く可能性が非常に高い

おまけ:
メールアドレスの規格はもっと複雑で、記号の制限などが厳しく決まっています。
実際では「メールアドレス用正規表現」をネットから拾ってきて使うのがいいかも!

目次