💁♂️
教えてChatGPT
正規表現を使ってみたい
皆さん、正規表を知ってますか?
郵便番号を特定したりするあの暗号みたいな文字ですね。考えるのが難しい...
でもChatGPTに聞いたら、教えてくれました!
今回やったのは、「半角文字かつ数字が文字数10文字以下になるように入力してください」という正規表現ですね。Dartのコードにするとこんな感じです。
void main() {
// 次の例は、文字列中の正規表現に最初にマッチするものを見つけるものです。
RegExp exp = RegExp(r'^[0-9a-zA-Zぁ-んァ-ヶー一-龠0-9\s]{0,10}$');// 半角文字かつ数字が文字数10文字以下ならOK
String str = '12345かきくけこ!';// 10文字以下の日本語入力可能な正規表現。11文字以上はエラーが出る!
RegExpMatch? match = exp.firstMatch(str);
print(match![0]);//090
}
FlutterのDemoアプリも作成しました
人間が考えるのは難しい😇
でも、AIなら候補をいくつか出してくれる。Demoアプリも作ってみました。良い出来なのかわからないですが、FormのValidationの種類を増やせそうですね。
ところでChatGPTってなんですか?
わかりやすく言うと、人間の代わりに記事を書いてくれたり、コードを書いてくれるAIのサービスですかね。万能ではないですが、正規表現は得意らしく代わりに考えてもらいました😅
今回使用したソースコード
エラーメッセージを表示するコード。別ファイルに書いております。条件と一致しないと画面に現れます。
service/regExp.dart
class regExpText {
static String? regText(String? value) {
if (value != null) {
String pattern = r'^[0-9a-zA-Zぁ-んァ-ヶー一-龠0-9\s]{0,10}$';
RegExp regExp = RegExp(pattern);
if (!regExp.hasMatch(value)) {
return '半角文字かつ数字が文字数10文字以下になるように入力してください!';
}
}
}
}
アプリの入力画面のコード。こちらで正規表現を使用して、入力が正しいか検証を行います。
ui/regularExpressions.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:ui_sample/service/regExp.dart';
// TextEditingControllerのProviderを定義.
final textProvider = StateProvider.autoDispose((ref) {
return TextEditingController(text: '');
});
class RegularExpressions extends ConsumerWidget {
const RegularExpressions({
Key? key,
}) : super(key: key);
Widget build(BuildContext context, WidgetRef ref) {
// TextEditingControllerのProviderを呼び出す.
final textC = ref.watch(textProvider.notifier).state;
return Scaffold(
appBar: AppBar(
title: const Text('正規表現'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextFormField(
controller: textC,
autovalidateMode: AutovalidateMode.onUserInteraction,
validator: regExpText.regText,
decoration: const InputDecoration(
filled: true, hintText: '10文字以下で半角文字と数字を入力'),
),
const SizedBox(
height: 16,
),
ElevatedButton(
onPressed: () {
// 正規表現を使用して、if文でtrueかfalseかで、実行するプログラムを変更する.
String pattern = r'^[0-9a-zA-Zぁ-んァ-ヶー一-龠0-9\s]{0,10}$';
RegExp regExp = RegExp(pattern);
if (regExp.hasMatch(textC.text)) {
print('条件が正しいのでデータが入力されました: ${textC.text}');
} else {
print('入力条件が正しくありません!');
}
},
child: const Text("登録"),
),
],
),
),
);
}
}
アプリを実行するコード
main.dart
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:ui_sample/ui/regularExpressions.dart';
void main() {
runApp(
const ProviderScope(child: MyApp()),
);
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
static const String _title = 'Flutter Code Sample';
Widget build(BuildContext context) {
return const MaterialApp(
restorationScopeId: 'app',
title: _title,
home: RegularExpressions(),
);
}
}
入力後のlog
I/flutter ( 9299): 条件が正しいのでデータが入力されました: abcde12345
I/flutter ( 9299): 入力条件が正しくありません!
I/flutter ( 9299): 入力条件が正しくありません!
まとめ
なぜ正規表を使おうと思ったのか?
Flutter別荘に合宿に参加したioriさんが正規表現を使っていたので、興味があって挑戦してみました。
こちらのサイトも参考になりました。皆さんも色々と試してみてください!
Discussion