Double Commanderは、Andrey Sorokinによって書かれたフリーのライブラリTRegExprを使用しています。
説明の多くは、このライブラリのヘルプファイルからのものです。
正規表現は、テキスト検索パターンを指定するために広く使われている方法です。特殊文字(メタ文字)により、例えば、探している特定の文字列が行の先頭や末尾に現れる場合や、文字または文字グループがn回出現する場合などを指定できます。
Double Commanderは以下の機能で正規表現をサポートしています:
TRegExprライブラリは、ANSIモードとUnicodeモードの2つの動作モードをサポートしています。テキストファイル内を検索する際、Double Commanderはファイルのエンコーディングに応じて両方を使用します。名前で検索する際にはUnicodeが使用されます。
単一の文字はそれ自体にマッチします。ただし、以下で述べられている特別な意味を持つメタ文字は例外です。
文字の並びは、対象となる文字列内のその並びにマッチします。つまり、パターンbluhは対象文字列内のbluhにマッチします。
メタ文字またはエスケープシーケンスの前にバックスラッシュ\を付けることで、それを文字通りに解釈させることができます。例えば、メタ文字^は文字列の先頭にマッチしますが、\^は文字^にマッチし、\\は\にマッチします。
以下にいくつかの例を示します:
| 単純なマッチングの例 | |
|---|---|
| 式 | 結果 |
foobar |
文字列foobarにマッチ |
\^FooBarPtr |
^FooBarPtrにマッチ |
CやPerlで使われるのと同様のエスケープシーケンス構文を使って文字を指定できます:\nは改行にマッチし、\tはタブにマッチします。
より一般的には、\xnn(ここでnnは16進数の並び)はASCII値がnnである文字にマッチします。
ワイド(Unicode)文字コードが必要な場合は、\x{nnnn}(ここでnnnn – 1つ以上の16進数)を使用できます。
| エスケープシーケンス | |
|---|---|
| 式 | 結果 |
\xnn |
ASCIIコードがnnの文字 |
\x{nnnn} |
ASCIIコードがnnnnの文字(通常のテキストでは1バイト、Unicodeでは2バイト) |
\t |
タブ(HT/TAB)、\x09と同じ |
\n |
改行(NL/LF)、\x0aと同じ |
\r |
復帰(CR)、\x0dと同じ |
\f |
改頁(FF)、\x0cと同じ |
\a |
警告音(ベル)(BEL)、\x07と同じ |
\e |
エスケープ(ESC)、\x1bと同じ |
以下にいくつかの例を示します:
| エスケープシーケンスの例 | |
|---|---|
| 式 | 結果 |
foo\x20bar |
foo barにマッチ(中央のスペースに注意) |
\tfoobar |
タブで始まるfoobarにマッチ |
文字リストを[]で囲むことで文字クラスを指定でき、これはリスト内のいずれか一つの文字にマッチします。
[の後の最初の文字が^の場合、そのクラスはリストに含まれない任意の文字にマッチします。
リスト内では、-文字を使って範囲を指定できます。したがって、a-zはaからzまでのすべての文字(両端含む)を表します。
-自体をクラスのメンバーにしたい場合は、リストの先頭または末尾に配置するか、バックスラッシュでエスケープしてください。
]を使用したい場合は、リストの先頭に配置するか、バックスラッシュでエスケープしてください。
| 文字クラス | |
|---|---|
| 式 | 結果 |
[-az] |
a、z、および-にマッチ |
[az-] |
a、z、および-にマッチ |
[a\-z] |
a、z、および-にマッチ |
[a-z] |
aからzまでのすべての26の小文字にマッチ |
[\n-\x0D] |
\x10、\x11、\x12、\x13のいずれかにマッチ |
[\d-t] |
任意の数字、-、またはtにマッチ |
[]-a] |
]からaまでの任意の文字にマッチ |
以下にいくつかの例を示します:
| 文字クラスの例 | |
|---|---|
| 式 | 結果 |
foob[aeiou]r |
foobar、fooberなどの文字列にマッチしますが、foobbr、foobcrなどにはマッチしません。 |
foob[^aeiou]r |
foobbr、foobcrなどの文字列にマッチしますが、foobar、fooberなどにはマッチしません。 |
いくつかの式は行区切りの検出に役立ちます。
| 行区切り | |
|---|---|
| 式 | 結果 |
^ |
行の先頭 |
$ |
行の末尾 |
\A |
テキストの先頭 |
\Z |
テキストの末尾 |
. |
行中の任意の文字 |
以下にいくつかの例を示します:
| 行区切りの例 | |
|---|---|
| 式 | 結果 |
^foobar |
文字列foobarが行の先頭にある場合のみマッチ |
foobar$ |
文字列foobarが行の末尾にある場合のみマッチ |
^foobar$ |
文字列foobarが行の中で唯一の文字列である場合のみマッチ |
foob.r |
foobar、foobbr、foob1rなどの文字列にマッチ |
デフォルトでは、^メタ文字は入力文字列/テキストの先頭でのみマッチし、$メタ文字は末尾でのみマッチします。埋め込まれた行区切りは^や$ではマッチしません。
しかし、文字列を複数行バッファとして扱い、^が文字列内の任意の行区切りの後にマッチし、$が任意の行区切りの前にマッチするようにしたい場合があります。これには修飾子mをオンにすることで実現できます。
\Aと\Zは^と$と似ていますが、修飾子mを使用しても複数回マッチすることはありません。一方で^と$は各内部行区切りでマッチします。
デフォルトでは、.メタ文字は任意の文字にマッチしますが、修飾子sをオフにすると、.は埋め込まれた行区切りにマッチしなくなります。
TRegExprは、Unicode技術標準(Technical Standard #18)に従って行区切りを処理します:
^は入力文字列の先頭にあり、かつ修飾子mがオンの場合、\x0D\x0Aまたは\x0Aまたは\x0Dの出現の直後にもマッチします(Unicode対応:\x2028または\x2029または\x0Bまたは\x0Cまたは\x85)。\x0D\x0Aシーケンス内には空行がないことに注意してください。
$は入力文字列の末尾にあり、かつ修飾子mがオンの場合、\x0D\x0Aまたは\x0Aまたは\x0Dの出現の直前にもマッチします(Unicode対応:\x2028または\x2029または\x0Bまたは\x0Cまたは\x85)。\x0D\x0Aシーケンス内には空行がないことに注意してください。
.は任意の文字にマッチしますが、修飾子sがオフの場合、.は\x0D\x0Aや\x0Aや\x0Dにはマッチしません(Unicode対応:\x2028や\x2029や\x0Bや\x0Cや\x85)。
^.*$(空行パターン)は\x0D\x0Aシーケンス内では空文字列にマッチしませんが、\x0A\x0Dシーケンス内では空文字列にマッチすることに注意してください。
いくつかの式は文字グループの検出に役立ちます。
| 事前定義されたクラス | |
|---|---|
| 式 | 結果 |
\w |
英数字文字(_を含む)、すなわち[0-9A-Za-z_] |
\W |
非英数字文字 |
\d |
数字文字 |
\D |
非数字文字 |
\s |
任意の空白文字([ \t\n\r\f]と同じ) |
\S |
非空白文字 |
カスタムの文字クラス内で\w、\d、\sを使用できます。
以下にいくつかの例を示します:
| 事前定義されたクラスの例 | |
|---|---|
| 式 | 結果 |
foob\dr |
foob1r、foob6rなどの文字列にマッチしますが、foobar、foobbrなどにはマッチしません |
foob[\w\s]r |
foobar、foob r、foobbrなどの文字列にマッチしますが、foob=rなどにはマッチしません |
単語境界(\b)とは、片側に\w、もう片側に\Wを持つ二つの文字の間の位置です(順序は問いません)。文字列の先頭と末尾の仮想的な文字は\Wにマッチするとみなされます。
| 単語境界 | |
|---|---|
| 式 | 結果 |
\b |
単語境界にマッチ |
\B |
非単語境界にマッチ |
正規表現の任意の要素の後に、別のタイプのメタ文字 – 繰り返し演算子を続けることができます。
これらのメタ文字を使用して、直前の文字、メタ文字、またはサブ式の出現回数を指定できます。
| 繰り返し演算子 | |
|---|---|
| 式 | 結果 |
* |
0回以上(「貪欲」)、{0,}と同じ |
+ |
1回以上(「貪欲」)、{1,}と同じ |
? |
0回または1回(「貪欲」)、{0,1}と同じ |
{n} |
ちょうどn回(「貪欲」) |
{n,} |
少なくともn回(「貪欲」) |
{n,m} |
少なくともn回だが、m回を超えない(「貪欲」) |
*? |
0回以上(「非貪欲」)、{0,}?と同じ |
+? |
1回以上(「非貪欲」)、{1,}?と同じ |
?? |
0回または1回(「非貪欲」)、{0,1}?と同じ |
{n}? |
ちょうどn回(「非貪欲」) |
{n,}? |
少なくともn回(「非貪欲」) |
{n,m}? |
少なくともn回だが、m回を超えない(「非貪欲」) |
したがって、{n,m}形式の波括弧内の数字は、マッチ項目の最小回数nと最大回数mを指定します。
{n}形式は{n,n}と同等で、ちょうどn回マッチします。
{n,}形式はn回以上マッチします。
nやmの大きさに制限はありませんが、大きな数字は実行速度を遅くし、より多くのメモリを消費します。
波括弧が他のコンテキストで出現する場合、それは通常の文字として扱われます。
以下にいくつかの例を示します:
| 繰り返し演算子の例 | |
|---|---|
| 式 | 結果 |
foob.*r |
foobar、foobalkjdflkj9r、foobrなどの文字列にマッチ |
foob.+r |
foobar、foobalkjdflkj9rなどの文字列にマッチしますが、foobrにはマッチしません |
foob.?r |
foobar、foobbr、foobrなどの文字列にマッチしますが、foobalkj9rにはマッチしません |
fooba{2}r |
文字列foobaarにマッチ |
fooba{2,}r |
foobaar、foobaaar、foobaaaarなどの文字列にマッチ |
fooba{2,3}r |
foobaarまたはfoobaaarなどの文字列にマッチしますが、foobaaaarにはマッチしません |
「貪欲性」について少し説明します。
「貪欲」とは可能な限り多く取り、「非貪欲」とは可能な限り少なく取ります。
例えば、b+やb*を文字列abbbbcに適用するとbbbbが返されますが、b+?はbを返し、b*?は空文字列を返し、b{2,3}?はbbを返し、b{2,3}はbbbを返します。
すべての繰り返し演算子を「非貪欲」モードに切り替えることができます(修飾子gを参照)。
|を使用して一連の代替を区切ることでパターンを指定できます。したがって、fee|fie|foeは対象文字列内のfee、fie、またはfoeにマッチします(f(e|i|o)eも同様です)。
最初の代替は、直前のパターン区切り文字((、[、またはパターンの開始)から最初の|までのすべてを含み、最後の代替は最後の|から次のパターン区切り文字までのすべてを含みます。
そのため、通常は代替を括弧で囲んで、開始位置と終了位置に関する混乱を最小限に抑えるのが一般的です。
代替は左から右へと試行されるため、式全体にマッチする最初に見つかった代替が選択されます。
これは、代替が必ずしも貪欲ではないことを意味します。
例えば:foo|footでbarefootにマッチさせる場合、最初に試行される代替はfooであり、これが対象文字列へのマッチに成功するため、foo部分のみがマッチします。(括弧を使用してマッチしたテキストをキャプチャする場合、これは重要ではないかもしれません。)
また、|は角括弧内ではリテラルとして解釈されるため、[fee|fie|foe]と書いた場合、実際には[feio|]にしかマッチしないことに注意してください。
例:
| 代替の例 | |
|---|---|
| 式 | 結果 |
foo(bar|foo) |
文字列foobarまたはfoofooにマッチ |
括弧構造( ... )は正規表現のサブ式を定義するためにも使用できます。
検索後、任意のサブ式を呼び出すことができ、サブ式をマスクとして使用することもできます。
サブ式は、左括弧の左から右への順序に従って番号付けられます。
最初のサブ式は1番で、最大90個のサブ式をサポートします(正規表現全体のマッチは0番 – $0または$&で置換できます)。
以下にいくつかの例を示します:
| サブ式 | |
|---|---|
| 式 | 結果 |
(foobar){8,10} |
8個、9個、または10個のfoobarインスタンスを含む文字列にマッチ |
foob([0-9]|a+)r |
foob0r、foob1r、foobar、foobaar、foobaarなどにマッチ |
「置換」テンプレートに関する注意:
$または\を配置したい場合は、接頭辞\を使用してください。1\$ is $2\\rub\\は1$ is <subexpr2>\rub\を返します。$nの後に元の数字を配置したい場合は、nを波括弧{}で囲む必要があります。a$12bcはa<subexpr12>bcを返しますが、a${1}2bcはa<subexpr1>2bcを返します。例:
日付21.01.2018を2018.01.21に逆転させてみましょう:
検索:(\d{2})\.(\d{2})\.(\d{4})
置換:$3.$2.$1
メタ文字\1から\9は後方参照として解釈されます。\nは以前にマッチしたサブ式nにマッチします。
以下にいくつかの例を示します:
| 後方参照の例 | |
|---|---|
| 式 | 結果 |
(.)\1+ |
aaaaおよびccにマッチ |
(.+)\1+ |
ababおよび123123にもマッチ |
(['"]?)(\d+)\1 |
"13"(二重引用符内)、'4'(単一引用符内)、または77(引用符なし)などにマッチ |
肯定先読みアサーション:foo(?=bar)はbarの前にあるfooにのみマッチし、barはマッチに含まれません。
否定先読みアサーション:foo(?!bar)はその後にbarが続かないfooにのみマッチします。
肯定後読みアサーション:(?<=foo)barはfooの後に続くbarにのみマッチし、fooはマッチに含まれません。
否定後読みアサーション:(?<!foo)barはその前にfooという接頭辞がないbarにのみマッチします。
制限:
先読みの括弧は式の末尾になければならず、後読みの括弧は式の先頭になければなりません。したがって、選択肢|間やグループ内でのアサーションはサポートされていません。
後読み(?<!foo)barの場合、正規表現fooは固定長でなければなりません。つまり、固定長マッチを行う操作のみを含まなければなりません。量指定子は使用できませんが、繰り返し数{n}または{n,n}を持つ波括弧は許可されます。ここでは文字クラス、ドット、\bおよび\Bの使用が許可されています。グループや選択肢の使用は禁止されています。
他の3つのアサーション型については、括弧内の式は任意の複雑さを持つことができます。
構文:(?:expr)。
このグループには「インデックス」がなく、後方参照からは見えません。サブ式をグループ化したいが、そのマッチ/キャプチャ部分を文字列として保存したくない場合に非キャプチャグループを使用します。非キャプチャグループを使用することで、正規表現の動作速度を向上させることができます。
| 非キャプチャグループ | |
|---|---|
| 式 | 結果 |
(https?|ftp)://([^/\r\n]+) |
https://doublecmd.sourceforge.ioにおいてhttpsとdoublecmd.sourceforge.ioにマッチ |
(?:https?|ftp)://([^/\r\n]+) |
https://doublecmd.sourceforge.ioにおいてdoublecmd.sourceforge.ioのみにマッチ |
構文:(?>expr|expr|...)。
アトミックグループは非キャプチャグループの特殊ケースです。パターンの一部がすでに見つかった場合、このようなグループは括弧グループのバックトラッキングを無効にします。アトミックグループはより高速に動作し、多数の異なる式を持つグループを最適化するのに役立ちます。
例えば、a(bc|b)cはabccとabcの両方にマッチしますが、a(?>bc|b)cはabccにはマッチしますがabcにはマッチしません。なぜなら、エンジンはバックトラッキングを禁止され、グループをbに設定しようとするからです。
Unicode標準では文字カテゴリに名前が付けられています。これらは2文字の文字列です。例えばLuは大文字、Llは小文字です。そして1文字の大カテゴリLはすべての文字を表します。
| Unicodeカテゴリ | |
|---|---|
| カテゴリ | 説明 |
L | 文字 |
Lu | 大文字 |
Ll | 小文字 |
Lt | タイトルケース文字 |
Lm | 修飾文字 |
Lo | その他文字 |
M | 記号 |
Mn | 非結合記号 |
Mc | 結合記号 |
Me | 囲み記号 |
N | 数字 |
Nd | 十進数字 |
Nl | 数字文字 |
No | その他の数字 |
P | 句読点 |
Pc | 接続句読点 |
Pd | ダッシュ句読点 |
Ps | 開き括弧 |
Pe | 閉じ括弧 |
Pi | 始め括弧 |
Pf | 終わり括弧 |
Po | その他の句読点 |
S | 記号 |
Sm | 数学記号 |
Sc | 通貨記号 |
Sk | 修飾記号 |
So | その他の記号 |
Z | 区切り文字 |
Zs | スペース区切り |
Zl | 行区切り |
Zp | 段落区切り |
C | その他 |
Cc | 制御文字 |
Cf | 書式文字 |
Cs | サロゲート |
Co | 私用領域 |
Cn | 未割り当て |
メタ文字\pは指定されたカテゴリの1つのUnicode文字を表します。構文:\pLおよび\p{L}は1文字の名前に使用され、\p{Lu}は2文字の名前に使用されます。
メタ文字\Pは逆で、指定されたカテゴリに含まれない1つのUnicode文字を表します。
これらのメタ文字は文字クラス内でもサポートされています。
単一の修飾子の構文:(?i)はオンを、(?-i)はオフを意味します。複数の修飾子も可能です。例:(?msgxr-imsgxr)。
修飾子は正規表現の動作を変更するために使用されます。修飾子は(?imsgxr-imsgxr)演算子の後の正規表現部分にのみ影響します。
これらの修飾子はどれも正規表現自体に埋め込むことができます。修飾子がサブ式にインライン化されている場合、そのサブ式にのみ影響します。
^と$が文字列の先頭または末尾のみにマッチするのではなく、文字列内の任意の行の先頭または末尾にマッチするようになります。詳しくは行セパレータをご覧ください。デフォルトではオフです。.が行セパレータ(詳しくは行セパレータをご覧ください)を含む任意の文字にマッチするようになりますが、通常はマッチしません。デフォルトではオンです。gがオフの場合、+は+?のように、*は*?のように動作します。а-яには追加でロシア語の文字ёが含まれ、А-ЯにはЁが含まれ、а-Яにはすべてのロシア語の文字が含まれます。デフォルトではオンです。textは無視されます。TRegExprは)を見るとコメントを閉じるため、コメント内にリテラル)を配置することはできません。以下にいくつかの例を示します:
| Perl拡張の例 | |
|---|---|
| 式 | 結果 |
(?i)Saint-Petersburg |
Saint-petersburgとSaint-Petersburgにマッチ |
(?i)Saint-(?-i)Petersburg |
Saint-Petersburgにマッチしますが、Saint-petersburgにはマッチしません |
(?i)(Saint-)?Petersburg |
Saint-petersburgとsaint-petersburgにマッチ |
((?i)Saint-)?Petersburg |
saint-Petersburgにマッチしますが、saint-petersburgにはマッチしません |
修飾子x自体についてさらに説明が必要です。
これは、バックスラッシュがつかず、文字クラスにも含まれない空白を無視するように指示します。
これを使用して正規表現を(多少)より読みやすい部分に分割することができます。
#文字もコメントを導入するメタ文字として扱われます。例:
(
(abc) # コメント1
| # 空白を使用して正規表現を整形できます - TRegExprはこれを無視します
(efg) # コメント2
)
これは、パターン内で実際の空白や#文字を使用したい場合(文字クラス外ではこれらはxの影響を受けません)、それらをエスケープするか、8進数または16進数のエスケープを使用してエンコードしなければならないことも意味します。
全体的に見て、これらの機能は正規表現テキストの可読性を大幅に向上させます。