グロブ
ワイルドカードパターンに一致するファイルを指定する操作
From Wikipedia, the free encyclopedia
起源
構文
最も一般的なワイルドカードは*、?、および[…]である。
| ワイルドカード | 解説 | 使用例 | ||
|---|---|---|---|---|
| グロブ表現 | マッチする文字列の例 | マッチしない文字列の例 | ||
* |
0文字以上の任意の文字列にマッチ | 営業* |
営業、営業実績 |
営、2019年度営業、2019年度営業計画 |
*営業* |
営業、営業実績、2019年度営業、2019年度営業計画 |
営 | ||
? |
任意の1文字にマッチ | 営業実績? |
営業実績1、営業実績B |
営業実績、営業実績12 |
[c1c2…cN] |
括弧内で列挙されたどれか1文字にマッチ | 営業実績[123] |
営業実績1、営業実績2、営業実績3 |
営業実績、営業実績4、営業実績12、 |
[cmin-cmax] |
括弧内で指定された範囲内の1文字にマッチ | 営業実績[0-9] |
営業実績1、営業実績3、営業実績4、営業実績5、営業実績9 |
営業実績、営業実績10、営業実績B、営業実績2019 |
いずれの場合においても、パス区切り文字(UNIXでは/、Windowsでは\)にマッチすることは絶対にない。
UNIX
LinuxやPOSIXのシステムでは*および?が定義されているが、[…]には以下の2つが追加されている[3][4]:
| ワイルドカード | 解説 | 使用例 | ||
|---|---|---|---|---|
| グロブ表現 | マッチする文字列の例 | マッチしない文字列の例 | ||
[!c1c2…cN] |
括弧内で列挙されていない何かの1文字にマッチ | 営業実績[!456] |
営業実績1、営業実績9、営業実績B |
営業実績、営業実績4、営業実績5、営業実績6、営業実績12 |
[!cmin-cmax] |
括弧内で指定されていない範囲内の1文字にマッチ | 営業実績[!3-5] |
営業実績1、営業実績9、営業実績B |
営業実績、営業実績3、営業実績4、営業実績5、営業実績10、営業実績2019 |
(C ShellやBashなどの)シェルの中には、AlternationやBrace Expansionとして知られる追加の構文をサポートしているものもある。
Bashは上記以外のパターンマッチ演算子を使用して、括弧で囲まれたパターンの複数発生へのマッチを可能にするextended globbing(拡張グロブ)もサポートする。この機能はextglobシェルオプションをセットすることで有効になる[5]。
Windows PowerShell
Windows PowerShellは、上記で述べたものと同様に定義された構文を全て搭載しているので、機能追加を行う必要はない[6]。
Windows
MS-DOSおよびWindowsの、COMMAND.COM と cmd.exe は、グロブ展開を行わず、コマンドラインにあるワイルドカードの * などは起動するプログラムにそのまま渡され、プログラム側で対応していればそれなりの動作をする(かもしれない)。シェルの内部コマンドなどで解釈される場合については制限付きながらほぼ同様の構文を持つが、構文が一見似ているだけで、「制限付き」の制限のおかげで全く別物であり、[…]は存在せず、さらにCOMMAND.COMの*はパターンの終わりにしか付けられない。
SQL
SQLの、LIKE条件中のパターンには、?や*に相当する表現が使える。[…]に相当する表現は存在しない。
| 通常のワイルドカード | SQLのワイルドカード |
|---|---|
? |
_ |
* |
% |
標準SQLにおけるLIKE条件では、単純な文字列マッチにグロブと似た構文を利用する。パーセント記号 (%) は0文字以上の文字列にマッチし、アンダースコアは1文字にマッチする。しかしながらSQLコミュニティにおいて「グロブ」という用語は一般的ではない。SQLの実装の多くはLIKE条件を拡張し、正規表現の要素を取り入れた、より豊富なパターンマッチを可能としている。
独自拡張SQLの中にはTransact-SQLのように、[…]の機能を提供するものもある。この例が[characters]や[^characters][7]である。
正規表現との比較
グロブには、式の前にある部分を複数回繰り返すことを可能とする、クリーネ閉包が無いなど、正規表現とは異なったものである。
| ワイルドカード | 等価の正規表現 |
|---|---|
? |
. |
* |
.* |
グロブは文字列全体とのマッチを試みる。例えば、営業実績*.xlsx は 営業実績.xlsx や 営業実績10月.xlsx にマッチするが、営業実績.xls や 2020年度営業実績.xlsx や 営業実績.docx にはマッチしない。
実装
Bash、tcsh、およびzshなどのUnixシェルは、コマンドラインやシェルスクリプトにおいてファイル名のグロブを提供する[8]。
Windowsのコマンドラインインタプリタであるcmd.exeは、グロブを行うアプリケーションのランタイム関数に依存している[9][10]。Windows PowerShellのCmdletはグロブをサポートする[11]。
より一般的には、上記で述べたような種類の限定されたパターンマッチング機能をUnixシェル以外の環境で引き合いに出すためにも「グロブ」という用語は使用される。Unixシェル以外の環境におけるグロブの例を以下に示す:
- D言語では
std.pathモジュールにglobMatchが搭載されている[12]。 - Node.jsには
minimatchと呼ばれるライブラリが搭載されている。これはnpmやmicromatchによって内部的に利用されており、より最適化された、正確で安全なグロブの実装である[13][14][15][16]。 - Goには
filepathパッケージにGlob関数が搭載されている[17]。 - Javaにはグロブパターンを操作するメソッドを含む、
Filesクラスが搭載されている[18]。 - Haskellにはメインモジュールである
System.FilePath.GlobにGlobパッケージが搭載されている。パターンの構文はzshのサブセットをベースとしている。このグロブは与えられたパターンの最適化を試みるので、単純な文字単位で行うマッチよりも格段に速いはずである[19]。 - Perlには
glob関数(ラリー・ウォールの著書であるプログラミングPerlで議論されている)と、BSDのグロブルーチンを模倣するGlob拡張の2つが搭載されている[20]。同様にして<*.log>のように、Perlの山括弧もグロブに利用できる。 - PHPには
glob関数が搭載されている[21]。 - Pythonには標準ライブラリに、ファイル名に対してワイルドカードパターンマッチングを行う
globモジュール[22]が搭載され、さらに文字列をマッチしたり、ファイル名に対するものと同じワイルドカードパターンに基づいて、文字列やフィルタリングリストとのマッチを行うための関数を含むfnmatchモジュールが搭載されている[23]。Pythonプログラミング言語の著者であるグイド・ヴァンロッサムは、1986年にBSD UNIXのglobルーチンを書いて寄与した[24]。彼による以前のglobルーチンは、以前のBSDリリースに含まれていたexとftpプログラムなどに含まれていた。 - Rubyには
Dirクラスに、ファイル名のワイルドカードパターンマッチングを行うglobメソッドが搭載されている[25]。RantやRakeなどのライブラリの中には、グロブメソッドを搭載するFileListクラスを提供したり、同等なFileList.[]メソッドを利用するものもある。 - SQLiteには
GLOB関数が搭載されている。 - Tclには本物の正規表現マッチング機能と、グロブと表現されることが多い、より限定された種類のパターンマッチングの2つが搭載されている[26]。