piapia123
ja

glob パターンの一致テスト

Web

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

glob(`*` `?` `[abc]` と二重アスタリスク)は間違えようがないほど単純に見えますが、互換性のない三つの方言があり、同じパターンが同じパスに対して shell・`.gitignore`・`.dockerignore` で違う結論を出すことがあります。先頭の `/` は shell では普通の文字、残り二つでは「ルートに固定」です。`/` を含まないパターンは shell では現在の階層だけ、gitignore ではどの階層でも一致します(`node_modules` が `packages/app/node_modules` に当たる必要があり、これを外すとほとんどの .gitignore が黙って効かなくなります)。`!` は shell では一致と無関係、残り二つでは否定です。 そこで方言を明示的なオプションにし、パターンを正規表現に直した形も一緒に表示します。他の実装を確かめるときに、同じものを見て比べられます。 ⚠️ よくある失敗はパターンをそのまま `new RegExp` に渡すことです。glob の `.` は普通の文字(正規表現では任意の一文字)、glob の `?` が任意の一文字(正規表現では量指定子)です。できあがった照合器は正常に見えて、意味はまったく違います。このツールは glob の規則でエスケープします。

機能

  • 三つの方言を別々に扱い、二重アスタリスク・先頭と末尾の `/`・`!` をそれぞれの規則で解釈します
  • パスごとに一致・不一致を示し、一致した行は緑で表示します
  • パターンを正規表現に直した形も表示し、他の実装との照合に使えます
  • gitignore / dockerignore の否定パターンは別に示します(一致したときの意味が逆です)
  • `[0-9]` と否定の `[!0-9]` に対応。閉じていない `[` は普通の文字として扱い、例外を投げません
  • 正規表現のメタ文字(`.` `+` `(`)は普通の文字としてエスケープするので、`*.js` が `aXjs` に一致することはありません
  • `a/` の後に二重アスタリスクを置くと `a` 自体にも一致し、先頭に二重アスタリスクを置くとルート直下の `a.ts` にも一致します
  • 大文字小文字の区別は切り替えられます

使い方

  1. 1 行目にパターン、2 行目以降に 1 行 1 パスを書きます
  2. 確かめたい対象に合わせて方言を選びます
  3. 行ごとの結論を見て、意外な行があれば上の正規表現を確認します
  4. パターンを書き換えると結果はその場で更新されます

よくある質問

`*.js` が `src/a.js` に一致しないのはなぜですか
shell の規則では `*` がパス区切りをまたがないため、`*.js` は現在のディレクトリの .js ファイルだけに一致します。階層をまたぐには「二重アスタリスク + スラッシュ」か `src/*.js` と書きます。正規表現の `.*` は既定で何でもまたぐので混同しやすく、glob を正規表現に直すときに `.*` と書いてしまう最大の落とし穴です。
先頭に二重アスタリスクを置いたパターンがルート直下の `a.ts` に一致するのはなぜですか
「二重アスタリスク + スラッシュ」の部分が「任意の階層、ゼロ階層も含む」を意味するからです。そのようなパターンを書く人が欲しいのは「すべての .ts ファイル」で、ルート直下のファイルも当然含まれます。したがってこの部分は丸ごと存在しないことを許す必要があります。手書きの実装はここを落としやすく、症状は「src 以下のファイルは全部当たるのに、ルート直下だけ全滅する」です。
.gitignore の `!` は何を意味しますか
否定です。直前まで無視していたものをもう一度含める指定になります。したがって否定規則が一致したときの意味は「無視しない」で、他の規則とは逆です。だからここでは別に表示します。shell の `!` はまったく別のもの(履歴展開)で一致とは無関係なので、shell 方言ではただの文字です。
.gitignore 全体をこれで検証できますか
パターンは一度に一つです。確認したい規則を 1 行目に置き、関係するパスをその下に並べます。ファイル全体を貼っても、パターンとして読まれるのは 1 行目だけなので機能しません。怪しい規則を二、三だけ抜き出して個別に試すほうが、「このファイルが無視されないのはなぜか」を探すよりずっと速いです。

関連ツール