1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

正規表現を構造化して記述できるライブラリを作りました!

Last updated at Posted at 2025-06-12

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を使ってみてください!

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?