\=
」「\/
」で始まる。また、独自仕様のアンカー修飾は「\!」で始まる。
この三つの文字シーケンスで始まるものについては、当面、使用しなくても良い。
特殊な機能や意味を持った文字。
指定した位置以外では通常の文字として扱われるものもある。
^ | 検索パターンの先頭にある場合は行の先頭を表す。 クラス指定の先頭にある場合は否定集合を示す。 |
$ | 行末を表す。 |
. | 任意の1文字との一致を表す。 |
* | 直前の単純要素の0個以上の一致を表す。 |
+ | 直前の単純要素の1個以上の一致を表す。 |
? | 直前の単純要素の0または、1個の一致を表す。 |
[ | クラス指定の始まり。 |
] | クラス指定の終わり。 |
- | クラス指定の中のコードのつなぎ。 |
( | 部分文字列指定の始まり。 |
) | 部分文字列指定の終わり。 |
| | 並列並びの区切り |
{ | 繰り返し指定の始まり。 |
} | 繰り返し指定の終わり。 |
\< | 文字列ブロックの始まり。 |
\> | 文字列ブロックの終わり。 |
部分文字列を表す。 | |
\= | 部分文字列記述や、拡張したアンカー類などの記述の開始。 |
\! | クラスの中では直前の要素の否定。クラスの後ろでは特殊なアンカーモード指定。 |
\/ | 現在位置をマークする。 |
\d | 組み込みクラス。数字1文字と一致。[0-9]と同じ |
\D | 組み込みクラス。数字以外1文字と一致。[^0-9]と同じ |
\s | 組み込みクラス。空白相当文字と一致 |
\S | 組み込みクラス。空白相当文字以外と一致 |
\w | 組み込みクラス。英数字と_に一致。[_0-9A-Za-z]と同じ |
\W | 組み込みクラス。英数字と_に不一致。[^_0-9A-Za-z]と同じ |
\N | 組み込みクラス。改行コード(\n)に不一致。[^\n]と同じ |
\C | 組み込みクラス。 |
\b | 単語境界(アンカー) |
\B | 単語境界ではない場所(アンカー) |
\m | 単語先頭 |
\M | 単語末尾 |
\A | 論理行頭。 |
\Z | 論理行末1。 |
\z | 論理行末2。 |
\T | いつも成立する(アンカー) |
\F | いつも成立しない(アンカー) |
エスケープ文字は、メタ文字にあたる文字自身や制御文字を表すために使用する。 エスケープ記号の後の文字は大文字と小文字を区別する。
\a | 制御文字 BELL(07h) |
\b | (制御文字 BS(08h)。クラス記述の中だけで有効) |
\e | 制御文字 ESC(1Bh) |
\f | 制御文字 FF(0Ch) |
\n | 制御文字 LF(0Ah) |
\r | 制御文字 CR(0Dh) |
\t | 制御文字 TAB(09h) |
\v | 制御文字 HM(0Bh) |
\\ | 「\ 」自身 |
\. | 「. 」自身 |
\* | 「* 」自身 |
\+ | 「+ 」自身 |
\? | 「? 」自身 |
\| | 「| 」自身 |
\( | 「( 」自身 |
\) | 「) 」自身 |
\{ | 「{ 」自身 |
\} | 「} 」自身 |
\[ | 「[ 」自身 |
\] | 「] 」自身 |
\- | 「- 」自身 |
\^ | 「^ 」自身 |
\$ | 「$ 」自身 |
\: | 何にも該当しない。常に読み飛ばされる。 |
\ | 「\ 」の後ろにスペースを書く。スペース |
\_ | 「 」。スペース |
\# | 「#」。番号記号。シャープ。 |
\q | 「'」。単引用符。 |
\Q | 「"」。複引用符。 |
\cChr | 英字で表す制御コード(0x00-0x1f)。\cA ならば 0x01 |
\xnn | 16進数で表した1バイトコード |
\jnnnn | 16進数で表した漢字コード(JISコード)。 |
\Xnnnn | 16進数で表した内部コード |
アプリケーションでオプション指定(多くの場合は -S
)することにより、拡張書式に切り替えることが出来る。
拡張書式はパターンを見やすくするために導入されたもので、空白文字、制御文字をすべて無視するので自由な形式で要素を書ける。
また、#
を書くと行末までを無視するので、#
以降行末まで注釈を書ける。
パターン中に空白(0x20)を書く場合には、「\
」を書けばよい(\
の後ろにスペース)。
「\
」はわかりにくいので、「\_
」を書いてもよい。
また、#
を書く場合には、「\#
」を書けばよい。
要素の並び [| 要素の並び]
要素は、単純要素と複合要素(「(...)
」)がある。
単純要素は、それ自身で単純な検索条件をあらわす。
複合要素は(「(...)
」)の中に要素の並びを「|
」で区切って書き、いずれかの要素並びが成立すれば、全体を成立とする(選択)。
また、複合要素には何種類かのバリエーションがある。
多くの要素は実際の文字に該当するパターンを表す。検索対象に該当する文字があれば、テキストポインタを進める。
これに対し、テキストポインターでの条件を検定するが、テキストポインタが決して進まない要素があり、これをアンカーと呼んでいる。
要素の後ろに修飾を書ける。修飾は、繰返修飾とアンカー修飾があり、要素によって使用できる修飾の種類が違う。どちらか一方の修飾を用いる。
繰り返し修飾は、要素の繰り返し回数を指定する。
アンカー修飾は、要素を検定の素材とするアンカーを指定する。
記法 | 名称 | 繰 返 修 飾 |
ア ン カ ー 修 飾 |
|||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
単純要素 | 中に別の要素を含まない単純な要素。繰返し修飾が出来る要素では、検索方法が指定でき、その順序で候補が見つかる。 複合要素よりもシステムのオーバーヘッドが少なく、一般に高速である。 | |||||||||||||||||||||||||||||||||||||||||||||||||||
c | ○ | ○ | 文字そのもの。 メタ文字以外の文字はそのまま、文字自身を表わす。 メタ文字に相当する文字を表すには \ を前につけてエスケープ表現する必要がある。
例えば、メタ文字でない $ を表すためには、\$ と書かなければならない。 |
|||||||||||||||||||||||||||||||||||||||||||||||||
. |
○ |
ピリオドは任意の1文字と一致する。 例えば、 a.b ピリオドは、すべての文字に一致する。NULL(\x00)や改行コードも例外ではない。もっとも、改行コード自体の扱いは、ツールの取り扱いに依存する。
アンカー指定は殆どの場合意味がないので機能から省いた。
必要ならば、クラス文字 |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
○ | ○ |
中に書ける要素は次の三種類。
文字の検定は先頭から順に行い、その要素に該当した時点で成立とする。該当するものが一つもなければ不成立となる。 [^0-9] 文字と文字範囲は後ろに [m\!a-z] m 以外の英小文字に該当する。最初に m\! で文字 m が除外され、a-z で残りの英小文字が選択される。文字と文字範囲は後ろに [A-Z\=\w] A-Z に該当する。最初に A-Z\= で A-Z 以外除外され、\w で英数字_が許されるが、結果的にA-Zになる。
組み込みクラス文字のうち、 |
|||||||||||||||||||||||||||||||||||||||||||||||||
\s \S \d \D \w \W \N |
○ | ○ |
よく使うクラス指定はメタ文字で指定できる。クラス指定の中でも記述できる。
|
|||||||||||||||||||||||||||||||||||||||||||||||||
\C{name} |
○ | ○ |
その他拡張したクラス文字。nameで種類を表す。クラス指定の中でも記述できる。 \C{control}
|
|||||||||||||||||||||||||||||||||||||||||||||||||
|
○* | ○ |
検索対象の中で、メタ文字「
これらのうち最初の9つは、「 \=nn; 部分文字列の引用は、該当する部分文字列の指定の後でなければならない(引用時に不成立となる)。 また、部分文字列の指定自体は入れ子にして指定できる。
(.)\1 |
|||||||||||||||||||||||||||||||||||||||||||||||||
|
○ | ○ |
ひとまとめの文字列。中にメタ文字やクラス指定をはさむことはできない。 エスケープされていない(「 繰返修飾を使った場合、最長一致は、最短一致共に正しく動作する。繰返限定指定も有効である。
同じ固定の文字列を使用するのであれば、 アンカー修飾は有用である。アンカー修飾をすると繰返を指定は出来ないが、様々な先後読み検定として便利に扱える。 \<abcdefg\>{2} abcdefg 二回の繰返し。
|
|||||||||||||||||||||||||||||||||||||||||||||||||
\=z |
テキスト末尾か、改行コードに一致。 改行コードそのものにも一致する。 通常は使わない。暫定的仕様なので、将来削除する可能性がある。 |
|||||||||||||||||||||||||||||||||||||||||||||||||||
複合要素 | (...) で囲み、中に要素並びが入っているもの。または、その引用
|
|||||||||||||||||||||||||||||||||||||||||||||||||||
|
○* |
書式: パターン(要素並び)のいずれかが成立することを表す(選択動作)。書いた順に試していく。 開き括弧に続けて書く記号でいくぶん、機能が異なる。
部分文字列は、「 可能な繰返修飾は、「 繰返修飾をした場合、検出した繰返しの全体を部分文字列に格納する。 abcabc
に対して
^(.)+$ 繰返修飾をした場合の検索結果の順序は保証しない。つまり、処理系の都合で現れる順にマッチする(実際は、回数の少ない方から順に検定するので、最短一致風に動作するのだが)。従って、 w+ (w)+ |
||||||||||||||||||||||||||||||||||||||||||||||||||
|
記述した正規表現自体、あるいは、その一部を引用して評価する。
番号付けする引用先は、単純な 引用するのは 単純に、 |
テキストポインターを進めず、その位置で検定だけを行うものをアンカーと呼んでいる。
代表的なものに、先頭「^
」、末尾「$
」アンカーがある。
記法 | 名称 | 繰 返 修 飾 |
|||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
単純要素 | 中に別の要素を含まない単純な要素。繰返し修飾が出来る要素では、検索方法が指定でき、その順序で候補が見つかる。 複合要素よりもシステムのオーバーヘッドが少なく、一般に高速である。 | ||||||||||||||||||||||||||||||||||||||||||||
^ |
テキスト先頭 | テキストポインタがテキスト先頭にある。 多くのアプリケーションでは、入力文字列=一行なので、行頭ということになる。 行頭以外の位置で 文字 ^ を使用する場合は、 \^ と書く(クラス定義の中などでは直に書ける)。
これは一般的な慣習に反するが、パターン内で行頭を書けるようにする為、あえて選択した。 |
|||||||||||||||||||||||||||||||||||||||||||
$ |
テキスト末尾 | テキストポインタがテキスト末尾にある。 多くのアプリケーションでは、入力文字列=一行なので、行末ということになる。 行末以外の位置で 文字 $ を使用する場合は、 \$ と書く(クラス定義の中などでは直に書ける)。
これは一般的な慣習に反するが、パターン内で行末を書けるようにする為、あえて選択した。 |
|||||||||||||||||||||||||||||||||||||||||||
^\! |
テキスト先頭ではない | テキストポインタがテキスト先頭にない。 |
|||||||||||||||||||||||||||||||||||||||||||
$\! |
テキスト末尾ではない | テキストポインタがテキスト末尾にない。 |
|||||||||||||||||||||||||||||||||||||||||||
\A \=^ |
論理行頭 |
テキスト先頭か、直前に改行コードがある。 |
|||||||||||||||||||||||||||||||||||||||||||
\Z |
論理行末1 |
テキスト末尾か、直後に改行コードがある。 |
|||||||||||||||||||||||||||||||||||||||||||
\z |
論理行末2 |
直後に改行コードがある。 |
|||||||||||||||||||||||||||||||||||||||||||
\G |
検索開始位置 | テキストポインタが検索開始位置にある。 CEXTRA.EXEのように複数回検索を繰り返すアプリケーションでは、結果が一致するごとに、検索開始位置を移動して検索を行う。 このときの指定された開始位置を示す。 一般にはパターンの先頭に書き、このときは、以降のパターンが必ず検索開始位置から始まることを示す。 |
|||||||||||||||||||||||||||||||||||||||||||
|
現在位置の左右のいずれかが単語(英数字、_)である境界位置。 | ||||||||||||||||||||||||||||||||||||||||||||
|
現在位置の左右の双方が単語(英数字、_)、あるいは、単語でない。 単号の境界でないことを示す。 |
||||||||||||||||||||||||||||||||||||||||||||
|
現在位置の左に単語(英数字、_)がなく、右に単語がある。 単語先頭の境界。 |
||||||||||||||||||||||||||||||||||||||||||||
|
現在位置の左に単語(英数字、_)があり、右に単語がない。 単語末尾の境界。 |
||||||||||||||||||||||||||||||||||||||||||||
|
いつも成立する。 |
||||||||||||||||||||||||||||||||||||||||||||
|
いつも成立しない。 |
||||||||||||||||||||||||||||||||||||||||||||
|
肯定的先読み |
○ |
テキストポインタの右から始まる文字列があることを示す。 エスケープされていない(「 |
||||||||||||||||||||||||||||||||||||||||||
|
否定的先読み |
○ |
テキストポインタの右から始まる文字列がないことを示す。 エスケープされていない(「 |
||||||||||||||||||||||||||||||||||||||||||
|
肯定的後読み |
○ |
テキストポインタの左で終わる文字列があることを示す。 エスケープされていない(「 |
||||||||||||||||||||||||||||||||||||||||||
|
否定的後読み |
○ |
テキストポインタの左で終わる文字列がないことを示す。 エスケープされていない(「 |
||||||||||||||||||||||||||||||||||||||||||
\/ |
書式:
アプリケーションにより機能が違うが、特定文字列の取り出し等に用いる。
|
||||||||||||||||||||||||||||||||||||||||||||
\=/? |
書式:
|
||||||||||||||||||||||||||||||||||||||||||||
|
書式:
|
||||||||||||||||||||||||||||||||||||||||||||
|
書式:
|
||||||||||||||||||||||||||||||||||||||||||||
|
書式:
|
||||||||||||||||||||||||||||||||||||||||||||
|
指定した部分文字列に値がある事を表す。 |
||||||||||||||||||||||||||||||||||||||||||||
|
指定した部分文字列に値がない事を表す。 |
||||||||||||||||||||||||||||||||||||||||||||
|
書式: \=nn{[^][min][,][max]} 指定した部分文字列を数値として解釈して、値が min以上max以下であることを表す。 「 ^ 」を指定すると範囲外を表す。
|
||||||||||||||||||||||||||||||||||||||||||||
|
書式: \=nn_{[^][min][,][max]} 指定した部分文字列の長さが min以上max以下であることを表す。 「 ^ 」を指定すると範囲外を表す。
|
||||||||||||||||||||||||||||||||||||||||||||
|
書式: \=nn@{[^][min][,][max]} 指定した部分文字列の幅が min以上max以下であることを表す。 「 ^ 」を指定すると範囲外を表す。全角文字は2として数え、それ以外は幅1として数える。 |
||||||||||||||||||||||||||||||||||||||||||||
|
書式: \=v{[^][min][,][max]} 括弧のレベルが範囲内にある。 ( .. ) で囲まれた中(部分文字列や、先後読み指定)に入るたびレベルが一つずつ増え、出ると、減る。
括弧の中にない部分のレベルは 0 。範囲指定の頭に ^ を書くと範囲外を表す。
|
||||||||||||||||||||||||||||||||||||||||||||
\=v* |
現在のレベルをマークする。 常に成立。 |
||||||||||||||||||||||||||||||||||||||||||||
|
書式: \=v?{[^][min][,][max]} マークしたレベルの値が範囲にある。 範囲指定の頭に ^ を書くと範囲外を表す。
|
||||||||||||||||||||||||||||||||||||||||||||
\=_+ |
パスカウントを+1する。 システムにひとつだけあるパスカウント(初期値は0)を増加させる。 常に成立。 |
||||||||||||||||||||||||||||||||||||||||||||
\=_- |
パスカウントを−1する。 システムにひとつだけあるパスカウント(初期値は0)を減少させる。 常に成立。 |
||||||||||||||||||||||||||||||||||||||||||||
\=_= nn; |
パスカウントに値をセットする。 常に成立。 |
||||||||||||||||||||||||||||||||||||||||||||
|
書式: \=_{[^][min][,][max]} パスカウントが範囲にある。 範囲指定の頭に ^ を書くと範囲外を表す。
|
||||||||||||||||||||||||||||||||||||||||||||
\=_* |
パスカウントを保存する。 常に成立。 |
||||||||||||||||||||||||||||||||||||||||||||
\=_? |
パスカウントとパスカウントのマークが同じ値。 |
||||||||||||||||||||||||||||||||||||||||||||
\=_! |
パスカウントとパスカウントのマークが異なる値。 |
||||||||||||||||||||||||||||||||||||||||||||
\=X{tsexpr} |
|
||||||||||||||||||||||||||||||||||||||||||||
複合要素 | (...) で囲み、中に要素並びが入っているもの。
|
||||||||||||||||||||||||||||||||||||||||||||
|
○* |
書式 テキストポインタの位置でパターン検索を行い、マッチを発見したところで打ち切り、成立とする。 すべての場合を尽くしてマッチしなければ不成立。 繰返し修飾はできるが、最短一致指定は無意味である。 |
|||||||||||||||||||||||||||||||||||||||||||
|
○* |
書式: テキストポインタでパターン検索を行い、マッチすれば不成立。すべての場合を尽くしてマッチしなければ成立。 |
|||||||||||||||||||||||||||||||||||||||||||
|
○* |
書式: テキストポインタから左へと順に検定を行う。それぞれの検定は成立すれば、打ち切り、その時点で全体の成立とする。 検定が成立しなければ、さらに右へテキストポインタを移して検定する。 こうして、文字列の先頭まで移動して成立しなければ、初めて不成立となる。 実用的な制限を加えるため、 |
|||||||||||||||||||||||||||||||||||||||||||
|
○* |
書式: テキストポインタから左へと順に検定を行う。それぞれの検定は成立ならば、打ち切り、その時点で全体の不成立とする。 検定すべての場合を尽くして不成立ならば、さらに右へテキストポインタを移して検定する。 こうして、文字列の先頭まで移動して成立しなければ、初めて成立となる。 実用的な制限を加えるため、 |
|||||||||||||||||||||||||||||||||||||||||||
|
普通の括弧の中のように中にパターン並びを書くが、書いたものは全く評価されない。
|
||||||||||||||||||||||||||||||||||||||||||||
|
部分文字列を対象に正規検索を行い、成立すれば真とする。 検索は特殊な形で行っているので多少の注意が必要だ。
・部分文字列の先頭は、検索開始位置として扱う。部分文字列の末尾は文字列の末尾として扱う。つまり、入力文字列を部分文字列の末尾で切り、検索開始位置を部分文字列の先頭としている。
・部分文字列の先頭は、「 \G 」と一致する。・部分文字列の末尾は、「 $ 」と一致する。 |
||||||||||||||||||||||||||||||||||||||||||||
|
部分文字列を対象に正規検索を行い、成立すれば偽とする。 検索は特殊な形で行っているので多少の注意が必要だ。
・部分文字列の先頭は、検索開始位置として扱う。部分文字列の末尾は文字列の末尾として扱う。つまり、入力文字列を部分文字列の末尾で切り、検索開始位置を部分文字列の先頭としている。
・部分文字列の先頭は、「 \G 」と一致する。・部分文字列の末尾は、「 $ 」と一致する。 |
多くの要素の後ろに以下の記号をつけることで、繰り返しを表すことができる。
繰返し回数を、
?
(0回か1回)、
+
(1回以上)、
*
(0回以上)、
{..}
(回数指定)を要素の後ろにつけることで表す。
検索の結果条件に合うものは複数見つかるが、見つける際の順序などで次の四つのバリエーションがある。
もっとも長いものから順に見つける。標準の検索方法。 | |
もっとも短いものから順に見つける。繰返し記号の後ろに ? をつける | |
もっとも長いものだけを候補とする。繰返し記号の後ろに + をつける | |
指定回数のテキストの繰返しとだけ一致する。
一致した部分の外側に連続した繰返しはなく、連続した繰返しの個数そのものを検定する。
回数指定についてのみ指定可能で回数指定を{?....} と書く。
|
(..)
)では、上の検索順序の指定はできず、一致の順序も保障しない。複合要素内部での単純要素そのものは記述に従った検索方法を取る。
* |
直前の要素の0回以上の繰り返し。長い方から検定する。 例えば、 ab*c a.*c 文字列「abcabcd」に対して検定すると、長い方から一致を見るので、 「abcabc」が最初の候補。 |
|
*? |
直前の要素の0回以上の繰り返し。短い方から検定する。a.*?c |
|
*+ |
直前の要素の0回以上の繰り返し。
長い方から検定するが、見つかった最長の候補のみが一致する。 |
|
+ |
1回以上の最長優先繰り返し | 直前の要素の1回以上の繰り返し。長い方から検定する。ab+c |
+? |
1回以上の最短優先繰り返し | 直前の要素の1回以上の繰り返し。短い方から検定する。 |
++ |
1回以上の最大繰り返し | 直前の要素の1回以上の繰り返し。
長い方から検定するが、見つかった最長のものだけが一致する。
|
? |
0、1回の一致(最長優先) | 「直前の要素の0または、1回の繰り返し」となっている。 |
?? |
0、1回の一致(最短優先) | 「直前の要素の0または、1回の繰り返し」となっている。短い方から検定する。 |
?+ |
0、1回の一致(最大) | 「直前の要素の0または、1回の繰り返し」となっている。
長い方から検定するが、見つかった最長のものだけが一致する。
|
|
指定回数の最長優先繰り返し | 書式: {[n][,][m]} 直前の要素の指定回数の繰り返し。長い方から検定する。 nは最小の回数(0以上)、mは最大の回数を指定する。 nはmよりも大きくないように指定する。 (念のため、内部処理では、 n、mの大きな方を最大回数、小さな方を最小回数として扱っているが、 これに頼るべきではない。) nを省略するとm以下の回数、mを省略するとn以上の回数の指定となる。 xa{1,3} |
{n,m}? |
指定回数の最短優先繰り返し | 書式: {[n][,][m]}? 直前の要素の指定回数の繰り返し。短い方から検定する xa{1,3}? a{1,3}?x |
{?n,m} |
指定回数の限定繰り返し | 書式: {?[n][,][m]} 直前の要素の指定回数の繰り返し。 繰り返し回数が厳密に範囲内であることを保障する。 <\abc\>{?1,2} |
{n,m}+ |
指定回数の最大繰り返し | 書式: {[n][,][m]}+ 直前の要素の指定回数の繰り返し。 長い方から検定するが、見つかった最長のものだけが一致する。 |
特定の要素を用いてテキストポインターの進まないアンカーを作り出す。
要素とアンカーの中間的なものも、この修飾で作り出す。
アンカー修飾は一般的には使用しなくても良い。
\b
の類を自由に作る際に使用すると良い。
\!$ |
現在位置の |
テキストポインタの右に指定の要素がない。
現在位置がテキスト末であれば、常に成立する。 |
|
直前位置の |
テキストポインタの左に要素がない。
ポインタがテキスト先頭であれば常に成立する。 |
\!+ |
現在位置の |
テキストポインタの右に指定の要素がある。 |
|
直前位置の |
テキストポインタの左に要素がある。 |
|
テキストポインタの左右どちらかに一方に要素がある\d\!* 数字の境界。 |
|
|
テキストポインタの左右に要素があるか、あるいは、双方に要素がない\d\!= 数字の境界ではない。 |
|
|
直前位置の |
テキストポインタが先頭であるか、その左に要素がある\n\!_ 論理的な行頭。テキストポインタが先頭か、直前に改行コードがある。 |
|
現在位置の |
テキストポインタが末尾であるか、その右に要素がある\n\!/ 論理的な行末。テキストポインタが末尾か、直後に改行コードがある。 |
|
ポインタの左右で |
テキストポインタの左右に要素がない |
|
ポインタの左右で |
テキストポインタの左に要素がなく、右に要素がある\w\!01 単語の先頭 |
|
ポインタの左右で |
テキストポインタの左に要素があり、右に要素がない\w\!10 単語の末尾 |
|
ポインタの左右で |
テキストポインタの左右に要素がある |
|
これはアンカーではない。 要素が一致すれば要素分ポインタが進み、成立 テキスト先頭ならば、ポインターが進まず成立。 暫定仕様。有用性の検討をしている。将来削除される可能性がある。 |
|
|
これはアンカーではない。 要素が一致すれば要素分ポインターが進み、成立。 また、テキスト末尾ならば、ポインターが進まずに成立。 暫定仕様。有用性の検討をしている。将来削除される可能性がある。 |
回数など数値の範囲の指定は、次の用に指定する(繰返し回数の場合は^
が使えない)。
{{[^][min][,][max]}
^
が使えない事に注意。
{4,10} | 4 - 10。 |
{^4,10} | 4 - 10 以外。n <4 または n>10。 |
{4,} | 4以上。n>=4。{4,∞} と同じ。 |
{^4,} | 4未満。n<4。{^4,∞} と同じ。 |
{,10} | 10以下。n<=10。{0,10} と同じ。 |
{^,10} | 10より大。n>10。{^0,10} と同じ。 |
{5} | 5。{5,5} と同じ。 |
{^5} | 5以外。n≠5。{^5,5} と同じ。 |
{} | 0。{0,0} と同じ。 |
{^} | 0より大。{^0,0} と同じ。 |
{,} | すべて。{0,∞} と同じ。 |
{^,} | 該当無し。{^0,∞} と同じ。 |
文字列の中に改行コードを入れると、文字列の中で複数の論理的な行を表すことが出来る。この改行コードの扱い方が多少面倒だ。
正規表現の中には、モードに応じて書き方の意味を変えることがあるが、これは避けたい(大文字小文字の区分指定だけはモードだが)。
「.
」(ピリオド)は、改行コードに一致しないシステムが多いが、本システムでは、どんな文字にも一致する。改行コードを特別扱いしない。
行頭と行末、あるいは、文字列先頭と文字列末尾のアンカーの意味は、次の通り。
^ | 文字列の先頭 |
$ | 文字列の末尾 |
\A | 論理行頭。文字列の先頭か、\n の直後。 |
\Z | 論理行末。文字列の末尾か、\n の直前。 |
\z | 論理行末。\n の直前。 |
最後の行の改行コードの有無の取り扱いは悩ましい。
abc\ndef
とabc\ndef\n
は、行の中身としては同じものを示す。しかし、行末の検出は注意しなければならない。
\A.*?\Z
はabc\ndef
では二行を検出するが、abc\ndef\n
からは、三行を検出する。最後の\nの後ろから行末の間の幅0の領域が一致するからだ。多少の注意が必要になる。0幅マッチしないパターンならば問題は無い。
アプリケーション lextra.exe cextra.exe では、行単位に処理する場合、改行コードは行に含まない。また、ファイル全体を読み込むモードでは標準の動作では、ファイル末尾の不完全行(改行コードがない)には改行コードを付加している。
記法 | 名称 | |
---|---|---|
|
書式: 条件パターンは、一般的にはアンカーを書き、後ろにマークをする。アンカーが成立すれば(マークが設定され)、マークが存在するのでthenパターンが評価され、成立しなければ、マークが存在しないのでelse パターンが評価される。
((?=a)\/|)(\=/?abc|\=/!def) |
パターンは順に実行するのだから、ただ、並べるだけでAND条件(途中で一つでも成立しなければ不成立)となる。
((?=cond1)(?=cond2)(?=cond3) .... )
実際は括弧を省いても、動作する。
()
内の選択機能、つまり、パターンの |
つなぎを使えばよい。
((?=cond1)|(?=cond2)|(?=cond3) | ... )
括弧は省けない。
大まかに書けば、開き括弧「(
」が現れるたびに新しい番号の部分文字列に格納が始まり、対応する閉じ括弧「)
」で格納が終わる。
言い換えれば、部分文字列の番号付けは、開き括弧が現れるたびに行われる。
(abc(def(hijk)lmn(op)))
括弧は繰返しや、パターンの選択に使用するので、いつも、部分文字列を指定するの不便でわずらわしい。 そこで、特に次の書き方をした場合は、部分文字列に格納しない。従って部分文字列の番号付けの対象にならない。
(?:..)
(?=...)
(?!...)
(?<=...)
(?<!...)
(?: ...( ... ) ... | ... (...) ... )
のように書くと、部分文字列の取り込みは二箇所で行われるが、それぞれ、別の部分文字列に格納される。
中は選択動作なので、前に書いてあるものか、後ろに書いてあるものかいずれか一方しか成立しない。
この内容を参照するときに、この例ならば、部分文字列の1番と2番に結果が入る。これが同じ文字列に入った方が、後の処理(または、後のパターン)で扱いやすくなることが多い。
このため、後から定義するときに、既に存在する部分文字列と同じ番号を割り振る記法を追加した。
(?: ...( ... ) ... | ... (?;...) ... )
(?; ... )
に割り振られる部分文字列番号は、現在までに出てきたもっとも大きな番号である。大抵の場合はこれは、直前の単純な開き括弧に対応する。
この例では、最初の部分文字列が1番で、次のものも1番となる。上の簡略記法のみを使うと同一番号の部分文字列は連続して使用するしかない。「離れた」ところで使用するために、
(?{nn} .... )
こういった込み入った記法を交えても、単純な開き括弧を数えれば部分文字列の番号がわかることは変わらない。
部分文字列をパターン内で引用する記法が二種類ある。
\n
\=nn;
\1 \2 \3 ... \9
が使えた。
10番以上の部分文字列引用を示すために、\=10;
などと書くことにした。この記法は、1―9番の部分文字列にも有効である。
いずれもアンカーとして(のように)働く。
\=nn?
と\=nn!
)
( ... | ... )
の選択機能が使えるので、例えば、一方の選択肢で部分文字列を記述し、他方で記述しなければ、後方のパターンにいたったとき、部分文字列が存在する場合と、存在しない場合がある。
これを後方で判定するときに使用する。
より積極的には、各選択肢に「()
」を入れておけば、これは常に成立し、長さ0の文字列を格納するのでポインターも進まない。これの存在検定することにすれば、パターンの前方でどの選択肢を通ったか、検定することができる。
\=nn{min,max}
)
正の整数に限定されているが、取り込んだ部分文字列のを数字と評価してその表す値が範囲内にある(「^
」を使えば範囲外も)ことを検定できる。このとき、数字以外の文字は存在しないことにして評価するので、「,
」などをはさんでもうまく動作する。
(\d+)\=1{10,255}
\=nn_{min,max}
と\=nn@{min,max}
)
長さの検定自体は、正規検索では簡単に出来ることが多いが、それでも、条件が複合した際にパターンの形を軽くする目的で使える。
\=nn_{min,max}
は半角、全角制御コードに関わらず文字数を数えるので標準的だが \=nn_{min,max}
は全角を2半角を1と数えるので便利なことが多い。
マーク(\/
)を書くと、そのテキストポインタの位置を記憶する。この情報は、アプリケーションで使用できる。(もともとは、アプリケーションに再検索する際の位置を検索一致以外の場所で指定するために設けたものであった)。
マークは99個あり、部分文字列と同様に \/
を書くたびに新しい番号が割り振られる。
現在のアプリケーションでは二つのマークを指定してその間を出力したり、置換の際に埋め込んだり出来る。
パターンないでも、マークの情報を使用した検定をいくつか用意した。
これも、部分文字列と同様だが、\/{}
を書くと、今まで最大のマーク番号と同じ番号が割り振られる。別の選択肢の中にあるそれぞれのマークに同じ番号を振ると場合などに使う。
さらに、部分文字列に習って、\/{nn}
を書くと、マーク番号を指定できる。
マークの検定は4種類要したが、いずれも、マークの番号を省略すれば、今まで割り振られた最大のマークの番号を指定する。 番号を指定する場合には、今まで現れたマーク番号の範囲で指定しなければならない。
\=/?
と\=/!
)
番号を指定する場合は、\=/{nn}?
と書く。
最後に「?
」がある方が、存在すれば成立、「!
」で終わる方が存在すれば不成立を表す。
選択肢の経過を記録してから、後での判断に使用できる。部分文字列でも出来るが、こちらの方が、シンプルに使える。
\=/{p}_{nn,mm}
と\=/{p}@{nn,mm}
)
長い指定だが、マークの番号と、そのマークから現在位置までの距離を検定するための最大値と最小値を書く。
マーク番号を省略すると今まで現れた最大のマーク番号(多くの場合は直前のマークの番号)となる。
\=/{p}_{nn,mm}
は、全角半角制御コードのいずれも、一文字として数えるが、
\=/{p}@{nn,mm}
は、全角を2、半角と制御コードは 1 として数える。
\=v{min,max}
)はあまり意味がない。\v*
)、後にそれを判定する(\v?{min.max}
)ことができる。
\=_=nn;
)、+1(\=_+
)したり、−1(\=_-
)できる。
パスカウントの値は、範囲検定できる(\=_={min,max}
)。(
を通過するたびに+1し、テキストの)
を通過するたびに−1すればつりあった括弧の位置では同じ値に戻る。
この方法でネストする括弧(に類する問題)を解決できる。\=_*
)、抜け出したところで、記憶した値とパスカウントが等しければ(\=_?
)抜け出したと判断できる。この方法では、パスカウントが相対化できるのがメリットである。
パスカウントとその記憶の不一致(\=_!
)も用意されている。
[a-z]\=x|,
\=x
。[a-z] であれば、また、自分自身を見て…、「, 」があれば、そこで終わる。書いたパターンの一部を引用できる。引用できるのは、パターン全体と、()
で囲んだ内容である。(?=...)
などはすべて対象となる。
開き括弧が出た順から、(
が出るたびに番号が上がっていく。最初の括弧が1番で、0番はパターン全体を表す。
パターン引用は、一般的には \=x{nn}
でパターン番号を指定する。
再帰パターンは、この機能のパターン番号を省略して0番(パターン全体)を指定した形で実現している。特定の括弧の中でその括弧を指定するパターン引用を行うと部分的再帰記述となる。
注釈的パターン((?%.....)
)は、書かれた場所では評価されないが、パターン引用できる。例えば、式の前の方で、定義しておけば、後方では同じ番号で、同じ記述を何回も参照できる。