Double Commander

2.14. 正規表現の構文

コンテンツ

1. イントロダクション
2. シンプルなマッチング
3. エスケープシーケンス
4. 文字クラス
5. メタキャラクター
5.1. メタキャラクター - 行セパレータ
5.2. メタキャラクター - 事前定義されたクラス
5.3. メタキャラクター - 単語境界
5.4. メタキャラクター - 反復子
5.5. メタキャラクター - 代替
5.6. メタキャラクター - サブエクスプレッション
5.7. メタキャラクター - 後方参照
6. アサーション(先読みと後読み)
7. 非キャプチャグループ
8. アトミックグループ
9. ユニコードカテゴリ
10. 修飾子

Double Commanderは、Andrey Sorokinによって書かれたフリーのライブラリTRegExprを使用しています。

説明の多くは、このライブラリのヘルプファイルからのものです。

1. 導入

正規表現は、テキスト検索パターンを指定するために広く使われている方法です。特殊文字(メタ文字)により、例えば、探している特定の文字列が行の先頭や末尾に現れる場合や、文字または文字グループがn回出現する場合などを指定できます。

Double Commanderは以下の機能で正規表現をサポートしています:

TRegExprライブラリは、ANSIモードとUnicodeモードの2つの動作モードをサポートしています。テキストファイル内を検索する際、Double Commanderはファイルのエンコーディングに応じて両方を使用します。名前で検索する際にはUnicodeが使用されます。

2. 単純なマッチング

単一の文字はそれ自体にマッチします。ただし、以下で述べられている特別な意味を持つメタ文字は例外です。

文字の並びは、対象となる文字列内のその並びにマッチします。つまり、パターンbluhは対象文字列内のbluhにマッチします。

メタ文字またはエスケープシーケンスの前にバックスラッシュ\を付けることで、それを文字通りに解釈させることができます。例えば、メタ文字^は文字列の先頭にマッチしますが、\^は文字^にマッチし、\\\にマッチします。

以下にいくつかの例を示します:

単純なマッチングの例
結果
foobar
文字列foobarにマッチ
\^FooBarPtr
^FooBarPtrにマッチ

3. エスケープシーケンス

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にマッチ

4. 文字クラス

文字リストを[]で囲むことで文字クラスを指定でき、これはリスト内のいずれか一つの文字にマッチします。

[の後の最初の文字が^の場合、そのクラスはリストに含まれない任意の文字にマッチします。

リスト内では、-文字を使って範囲を指定できます。したがって、a-zaからzまでのすべての文字(両端含む)を表します。

-自体をクラスのメンバーにしたい場合は、リストの先頭または末尾に配置するか、バックスラッシュでエスケープしてください。

]を使用したい場合は、リストの先頭に配置するか、バックスラッシュでエスケープしてください。

文字クラス
結果
[-az]
az、および-にマッチ
[az-]
az、および-にマッチ
[a\-z]
az、および-にマッチ
[a-z]
aからzまでのすべての26の小文字にマッチ
[\n-\x0D]
\x10\x11\x12\x13のいずれかにマッチ
[\d-t]
任意の数字、-、またはtにマッチ
[]-a]
]からaまでの任意の文字にマッチ

以下にいくつかの例を示します:

文字クラスの例
結果
foob[aeiou]r
foobarfooberなどの文字列にマッチしますが、foobbrfoobcrなどにはマッチしません。
foob[^aeiou]r
foobbrfoobcrなどの文字列にマッチしますが、foobarfooberなどにはマッチしません。

5. メタ文字

メタ文字は正規表現の中核であり、特殊文字です。

さまざまな種類のメタ文字があり、以下で説明します。

5.1. メタ文字 - 行区切り

いくつかの式は行区切りの検出に役立ちます。

行区切り
結果
^
行の先頭
$
行の末尾
\A
テキストの先頭
\Z
テキストの末尾
.
行中の任意の文字

以下にいくつかの例を示します:

行区切りの例
結果
^foobar
文字列foobarが行の先頭にある場合のみマッチ
foobar$
文字列foobarが行の末尾にある場合のみマッチ
^foobar$
文字列foobarが行の中で唯一の文字列である場合のみマッチ
foob.r
foobarfoobbrfoob1rなどの文字列にマッチ

デフォルトでは、^メタ文字は入力文字列/テキストの先頭でのみマッチし、$メタ文字は末尾でのみマッチします。埋め込まれた行区切りは^$ではマッチしません。

しかし、文字列を複数行バッファとして扱い、^が文字列内の任意の行区切りの後にマッチし、$が任意の行区切りの前にマッチするようにしたい場合があります。これには修飾子mをオンにすることで実現できます。

\A\Z^$と似ていますが、修飾子mを使用しても複数回マッチすることはありません。一方で^$は各内部行区切りでマッチします。

デフォルトでは、.メタ文字は任意の文字にマッチしますが、修飾子sをオフにすると、.は埋め込まれた行区切りにマッチしなくなります。

TRegExprは、Unicode技術標準(Technical Standard #18)に従って行区切りを処理します:

^.*$(空行パターン)は\x0D\x0Aシーケンス内では空文字列にマッチしませんが、\x0A\x0Dシーケンス内では空文字列にマッチすることに注意してください。

5.2. メタ文字 - 事前定義されたクラス

いくつかの式は文字グループの検出に役立ちます。

事前定義されたクラス
結果
\w
英数字文字(_を含む)、すなわち[0-9A-Za-z_]
\W
非英数字文字
\d
数字文字
\D
非数字文字
\s
任意の空白文字([ \t\n\r\f]と同じ)
\S
非空白文字

カスタムの文字クラス内で\w\d\sを使用できます。

以下にいくつかの例を示します:

事前定義されたクラスの例
結果
foob\dr
foob1rfoob6rなどの文字列にマッチしますが、foobarfoobbrなどにはマッチしません
foob[\w\s]r
foobarfoob rfoobbrなどの文字列にマッチしますが、foob=rなどにはマッチしません

5.3. メタ文字 - 単語境界

単語境界(\b)とは、片側に\w、もう片側に\Wを持つ二つの文字の間の位置です(順序は問いません)。文字列の先頭と末尾の仮想的な文字は\Wにマッチするとみなされます。

単語境界
結果
\b
単語境界にマッチ
\B
非単語境界にマッチ

5.4. メタ文字 - 繰り返し

正規表現の任意の要素の後に、別のタイプのメタ文字 – 繰り返し演算子を続けることができます。

これらのメタ文字を使用して、直前の文字、メタ文字、またはサブ式の出現回数を指定できます。

繰り返し演算子
結果
*
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回以上マッチします。

nmの大きさに制限はありませんが、大きな数字は実行速度を遅くし、より多くのメモリを消費します。

波括弧が他のコンテキストで出現する場合、それは通常の文字として扱われます。

以下にいくつかの例を示します:

繰り返し演算子の例
結果
foob.*r
foobarfoobalkjdflkj9rfoobrなどの文字列にマッチ
foob.+r
foobarfoobalkjdflkj9rなどの文字列にマッチしますが、foobrにはマッチしません
foob.?r
foobarfoobbrfoobrなどの文字列にマッチしますが、foobalkj9rにはマッチしません
fooba{2}r
文字列foobaarにマッチ
fooba{2,}r
foobaarfoobaaarfoobaaaarなどの文字列にマッチ
fooba{2,3}r
foobaarまたはfoobaaarなどの文字列にマッチしますが、foobaaaarにはマッチしません

「貪欲性」について少し説明します。

「貪欲」とは可能な限り多く取り、「非貪欲」とは可能な限り少なく取ります。

例えば、b+b*を文字列abbbbcに適用するとbbbbが返されますが、b+?bを返し、b*?は空文字列を返し、b{2,3}?bbを返し、b{2,3}bbbを返します。

すべての繰り返し演算子を「非貪欲」モードに切り替えることができます(修飾子gを参照)。

5.5. メタ文字 - 代替

|を使用して一連の代替を区切ることでパターンを指定できます。したがって、fee|fie|foeは対象文字列内のfeefie、またはfoeにマッチします(f(e|i|o)eも同様です)。

最初の代替は、直前のパターン区切り文字(([、またはパターンの開始)から最初の|までのすべてを含み、最後の代替は最後の|から次のパターン区切り文字までのすべてを含みます。

そのため、通常は代替を括弧で囲んで、開始位置と終了位置に関する混乱を最小限に抑えるのが一般的です。

代替は左から右へと試行されるため、式全体にマッチする最初に見つかった代替が選択されます。

これは、代替が必ずしも貪欲ではないことを意味します。

例えば:foo|footbarefootにマッチさせる場合、最初に試行される代替はfooであり、これが対象文字列へのマッチに成功するため、foo部分のみがマッチします。(括弧を使用してマッチしたテキストをキャプチャする場合、これは重要ではないかもしれません。)

また、|は角括弧内ではリテラルとして解釈されるため、[fee|fie|foe]と書いた場合、実際には[feio|]にしかマッチしないことに注意してください。

例:

代替の例
結果
foo(bar|foo)
文字列foobarまたはfoofooにマッチ

5.6. メタ文字 - サブ式

括弧構造( ... )は正規表現のサブ式を定義するためにも使用できます。

検索後、任意のサブ式を呼び出すことができ、サブ式をマスクとして使用することもできます。

サブ式は、左括弧の左から右への順序に従って番号付けられます。

最初のサブ式は1番で、最大90個のサブ式をサポートします(正規表現全体のマッチは0番 – $0または$&で置換できます)。

以下にいくつかの例を示します:

サブ式
結果
(foobar){8,10}
8個、9個、または10個のfoobarインスタンスを含む文字列にマッチ
foob([0-9]|a+)r
foob0rfoob1rfoobarfoobaarfoobaarなどにマッチ

「置換」テンプレートに関する注意:

例:

日付21.01.20182018.01.21に逆転させてみましょう:
  検索:(\d{2})\.(\d{2})\.(\d{4})
  置換:$3.$2.$1

5.7. メタ文字 - 後方参照

メタ文字\1から\9は後方参照として解釈されます。\nは以前にマッチしたサブ式nにマッチします。

以下にいくつかの例を示します:

後方参照の例
結果
(.)\1+
aaaaおよびccにマッチ
(.+)\1+
ababおよび123123にもマッチ
(['"]?)(\d+)\1
"13"(二重引用符内)、'4'(単一引用符内)、または77(引用符なし)などにマッチ

6. アサーション(先読みと後読み)

肯定先読みアサーション:foo(?=bar)barの前にあるfooにのみマッチし、barはマッチに含まれません。

否定先読みアサーション:foo(?!bar)はその後にbarが続かないfooにのみマッチします。

肯定後読みアサーション:(?<=foo)barfooの後に続くbarにのみマッチし、fooはマッチに含まれません。

否定後読みアサーション:(?<!foo)barはその前にfooという接頭辞がないbarにのみマッチします。

制限:

7. 非キャプチャグループ

構文:(?:expr)

このグループには「インデックス」がなく、後方参照からは見えません。サブ式をグループ化したいが、そのマッチ/キャプチャ部分を文字列として保存したくない場合に非キャプチャグループを使用します。非キャプチャグループを使用することで、正規表現の動作速度を向上させることができます。

非キャプチャグループ
結果
(https?|ftp)://([^/\r\n]+)
https://doublecmd.sourceforge.ioにおいてhttpsdoublecmd.sourceforge.ioにマッチ
(?:https?|ftp)://([^/\r\n]+)
https://doublecmd.sourceforge.ioにおいてdoublecmd.sourceforge.ioのみにマッチ

8. アトミックグループ

構文:(?>expr|expr|...)

アトミックグループは非キャプチャグループの特殊ケースです。パターンの一部がすでに見つかった場合、このようなグループは括弧グループのバックトラッキングを無効にします。アトミックグループはより高速に動作し、多数の異なる式を持つグループを最適化するのに役立ちます。

例えば、a(bc|b)cabccabcの両方にマッチしますが、a(?>bc|b)cabccにはマッチしますがabcにはマッチしません。なぜなら、エンジンはバックトラッキングを禁止され、グループをbに設定しようとするからです。

9. Unicodeカテゴリ

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文字を表します。

これらのメタ文字は文字クラス内でもサポートされています。

10. 修飾子

単一の修飾子の構文:(?i)はオンを、(?-i)はオフを意味します。複数の修飾子も可能です。例:(?msgxr-imsgxr)

修飾子は正規表現の動作を変更するために使用されます。修飾子は(?imsgxr-imsgxr)演算子の後の正規表現部分にのみ影響します。

これらの修飾子はどれも正規表現自体に埋め込むことができます。修飾子がサブ式にインライン化されている場合、そのサブ式にのみ影響します。

i
大文字・小文字を区別しないパターンマッチングを実行します(システムにインストールされたロケールを使用)。デフォルトではオフです。
m
文字列を複数行として扱います。つまり、^$が文字列の先頭または末尾のみにマッチするのではなく、文字列内の任意の行の先頭または末尾にマッチするようになります。詳しくは行セパレータをご覧ください。デフォルトではオフです。
s
文字列を単一行として扱います。つまり、.が行セパレータ(詳しくは行セパレータをご覧ください)を含む任意の文字にマッチするようになりますが、通常はマッチしません。デフォルトではオンです。
g
非標準修飾子です。これをオフにすると、すべての後続の演算子が非貪欲モードに切り替わります(デフォルトではこの修飾子はオンです)。したがって、修飾子gがオフの場合、++?のように、**?のように動作します。
x
空白とコメントを許可することでパターンの可読性を拡張します(下記の説明を参照)。デフォルトではオフです。
r
非標準修飾子です。設定されている場合、範囲а-яには追加でロシア語の文字ёが含まれ、А-ЯにはЁが含まれ、а-Яにはすべてのロシア語の文字が含まれます。デフォルトではオンです。
#
(?#text):コメント、textは無視されます。TRegExprは)を見るとコメントを閉じるため、コメント内にリテラル)を配置することはできません。

以下にいくつかの例を示します:

Perl拡張の例
結果
(?i)Saint-Petersburg
Saint-petersburgSaint-Petersburgにマッチ
(?i)Saint-(?-i)Petersburg
Saint-Petersburgにマッチしますが、Saint-petersburgにはマッチしません
(?i)(Saint-)?Petersburg
Saint-petersburgsaint-petersburgにマッチ
((?i)Saint-)?Petersburg
saint-Petersburgにマッチしますが、saint-petersburgにはマッチしません

修飾子x自体についてさらに説明が必要です。

これは、バックスラッシュがつかず、文字クラスにも含まれない空白を無視するように指示します。

これを使用して正規表現を(多少)より読みやすい部分に分割することができます。

#文字もコメントを導入するメタ文字として扱われます。例:

(
  (abc) # コメント1
    |   # 空白を使用して正規表現を整形できます - TRegExprはこれを無視します
  (efg) # コメント2
)

これは、パターン内で実際の空白や#文字を使用したい場合(文字クラス外ではこれらはxの影響を受けません)、それらをエスケープするか、8進数または16進数のエスケープを使用してエンコードしなければならないことも意味します。

全体的に見て、これらの機能は正規表現テキストの可読性を大幅に向上させます。


Valid HTML 4.0 Transitional CSS Valid!