carol.js
というライブラリを作成したので紹介します。
この記事はChatGPTにより執筆されました。正確性は確認済みです。
生成された内容は一部変更しています。
正規表現は便利だけど、書くのも読むのもつらい。
carol.js
は、その悩みを 「構造化」 で解決します。
😖正規表現の壁:それ、構造がないからでは?
例えば、こういう正規表現を見たことありませんか?
const re = /^[-+]?\d+(\.\d+)?$/;
「なるほど...これは符号付きの小数...かな?」
頭ではわかっても、保守や拡張をしようとすると非常に面倒。
なぜか?
👉 正規表現は構造が見えない文字列だからです。
- どこがオプションなのか
- 何が繰り返しなのか
- どこで意味が分かれるのか
これらが1行の文字列に埋もれてしまうのが、最大の読みづらさの原因です。
💡 解決策:正規表現に構造を与えるcarol.js
carol.js
は、JavaScript/TypeScript のコードで構造的に正規表現を組み立てられるライブラリです。ES Modulesで動作します。
👉 GitHub リポジトリはこちら
以下のコードを見てみましょう:
import C from "carol-js";
const sign = C.token("[-+]").option();
const int = C.token("\\d+");
const decimal = C.seq([C.token("\\."), C.token("\\d+")]).option();
const number = C.seq([sign, int, decimal]);
const re = number.toRegex({ exact: true });
console.log(re); // => /^(?:[-+])?\d+(?:\.\d+)?$/
通常の正規表現と同じようにRegExpオブジェクトを出力できます。
🔁 小さな部品でパターンを構成できる
文字列で正規表現を書くと、意味のかたまりを分離できません。
でもcarol.js
を使えば、それぞれの意味ごとに部品化できます。
import C from "carol-js";
const identifier = C.token("[a-zA-Z_][a-zA-Z0-9_]*");
const funcCall = C.seq([
identifier.capture(), // 関数名
C.token("\\("),
C.token(".*").option(), // 引数(ざっくり)
C.token("\\)")
]);
const re = funcCall.toRegex({ exact: true });
console.log(re); // => /^([a-zA-Z_][a-zA-Z0-9_]*)\((?:.*)?\)$/
構造化されたコードから、正規表現が生成されます。
📦 インストール
npm install carol-js
npmからインストールできます。
🙌 まとめ
carol.js
を使えば、これまで「読みにくくてブラックボックスだった正規表現」が、明示的なロジックと構造に変わります。
- 構造的に考える
- パーツを分けて再利用する
- 最終的に正しい正規表現文字列を出力する
コードは設計できるのに、なぜ正規表現は設計できないままだったのか?
その違和感を感じた方、ぜひcarol.js
を使ってみてください!