🎯

Dartで正規表現

2024/08/28に公開

🔅Tips

Dartで正規表現を使った例の紹介があるようで、自分の知りたいパターンがなかった。なので、作ってみた。文字、記号、数字に対応。

https://api.flutter.dev/flutter/dart-core/RegExp-class.html
https://flutter.salon/dart/regexp/

正規表現のチートシート

基本的なメタ文字

パターン 説明
. 任意の1文字
^ 行の先頭
$ 行の末尾
* 直前の文字が0回以上繰り返される
+ 直前の文字が1回以上繰り返される
? 直前の文字が0回または1回繰り返される
\ エスケープ文字(メタ文字を文字として扱う)

文字クラス

パターン 説明
[abc] abcのいずれか1文字
[^abc] abc以外の任意の1文字
[a-z] 小文字のアルファベット1文字
[A-Z] 大文字のアルファベット1文字
[0-9] 数字1文字
\d 数字1文字([0-9]と同じ)
\D 数字以外の1文字([^0-9]と同じ)
\w 英数字またはアンダースコア1文字([a-zA-Z0-9_]と同じ)
\W 英数字またはアンダースコア以外の1文字([^a-zA-Z0-9_]と同じ)
\s 空白文字(スペース、タブ、改行など)
\S 空白文字以外の1文字

繰り返し

パターン 説明
{n} 直前の文字がちょうどn回繰り返される
{n,} 直前の文字がn回以上繰り返される
{n,m} 直前の文字がn回以上m回以下繰り返される

グループ化と参照

パターン 説明
(abc) abcのグループ
(?:abc) 非キャプチャグループ(後方参照しない)
\1, \2, ... キャプチャグループの後方参照

位置指定子

パターン 説明
\b 単語の境界
\B 単語の境界以外

パターン 説明
^\d{3}-\d{4}$ 郵便番号(例: 123-4567)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$ メールアドレス
\b\d{3}-\d{4}\b 文中の郵便番号(例: "住所は123-4567です")

正規表現の使用例

使用例 説明
str.replaceAll(RegExp('a'), '') 特定の文字(例: a)を除外する
RegExp(r'\d+').allMatches(str).map((m) => m.group(0)) 数字のみを抽出する
RegExp(r'[ァ-ヶー]+').allMatches(str).map((m) => m.group(0)) カタカナのみを抽出する
RegExp(r'[ぁ-ん]+').allMatches(str).map((m) => m.group(0)) ひらがなのみを抽出する
RegExp(r'[a-zA-Z]+').allMatches(str).map((m) => m.group(0)) アルファベットのみを抽出する
RegExp(r'[A-Z]+').allMatches(str).map((m) => m.group(0)) 大文字のみを抽出する
RegExp(r'[a-z]+').allMatches(str).map((m) => m.group(0)) 小文字のみを抽出する

使用例のコード(Dart)

void main() {
  // 特定の文字(例: 'a')を除外する
  String str1 = "apple banana grape";
  String result1 = str1.replaceAll(RegExp('a'), ''); // 'pple bnn grpe'
  print(result1);

  // 数字のみを抽出する
  String str2 = "abc123def456";
  Iterable<RegExpMatch> matches2 = RegExp(r'\d+').allMatches(str2);
  List<String> result2 = matches2.map((m) => m.group(0)!).toList(); // ['123', '456']
  print(result2);

  // カタカナのみを抽出する
  String str3 = "カタカナとひらがなと漢字";
  Iterable<RegExpMatch> matches3 = RegExp(r'[ァ-ヶー]+').allMatches(str3);
  List<String> result3 = matches3.map((m) => m.group(0)!).toList(); // ['カタカナ']
  print(result3);

  // ひらがなのみを抽出する
  String str4 = "カタカナとひらがなと漢字";
  Iterable<RegExpMatch> matches4 = RegExp(r'[ぁ-ん]+').allMatches(str4);
  List<String> result4 = matches4.map((m) => m.group(0)!).toList(); // ['ひらがな']
  print(result4);

  // アルファベットのみを抽出する
  String str5 = "abc123DEF456";
  Iterable<RegExpMatch> matches5 = RegExp(r'[a-zA-Z]+').allMatches(str5);
  List<String> result5 = matches5.map((m) => m.group(0)!).toList(); // ['abc', 'DEF']
  print(result5);

  // 大文字のみを抽出する
  String str6 = "abcDEFghi";
  Iterable<RegExpMatch> matches6 = RegExp(r'[A-Z]+').allMatches(str6);
  List<String> result6 = matches6.map((m) => m.group(0)!).toList(); // ['DEF']
  print(result6);

  // 小文字のみを抽出する
  String str7 = "abcDEFghi";
  Iterable<RegExpMatch> matches7 = RegExp(r'[a-z]+').allMatches(str7);
  List<String> result7 = matches7.map((m) => m.group(0)!).toList(); // ['abc', 'ghi']
  print(result7);
}

Discussion