正規表現は英語の "Regular Expression" の訳です。文字列のパターンを表現するために使われます。
(正式な定義がどうなっているのかは知りませんので、正しい表現ではないかもしれません)
正規表現はUNIXの世界では古くから使われてきました。テキストデータの加工をするツールでは、大抵正規表現が使えるようです。
Windows(DOS)の世界では、ワイルドカードがよく使われてきましたが、正規表現の方が細かい指定が可能です。その分難しい(奥が深い)のも事実ですが。
元々は数学系の用語のようで、その場合正則表現という訳になるようです。もちろん、この場合上記の定義は嘘になります。テキスト処理のための解説なので、細かいことは許してください(笑)
このページで使っている正規表現についての用語のうち、分かり難そうな単語について簡単に説明しておきます。
文字の事です(分かってるって?(笑))。ちゃんと日本語で書けよという方、正論です。ただ、正論は時によっては極論でもあります。
文字の集合の事です(そのまんまですが(笑))。
ちなみに「何も文字を含まない」場合でも「文字列」とみなされます。それを区別したい時には「空文字列」(又は、単に「空文字」)といいます。
文字列の集合の事(笑)
半角英数字文字とアンダースコア(_)で構成された文字列の事です。実際の英単語として機能しないもの(aaaなど)も含みます。
空白として認識される文字。
通常の使用では、半角スペースとタブ文字がこれにあたります。漢字を使う場合、全角スペースも含むかもしれません。場合によってはフォームフィードや、垂直タブもそうでしょう。
HTML的に言えば、改行コードも空白文字かもしれません。
ここでは簡単に、K2Editorで空白として表示されるものだと思ってもらってもいいと思います。正規表現的には「\s」で表されるものです。(後述)
行頭から行末の間に文字が無い行。つまり、改行のみの行の事。
空白文字のみの行も含むことがあります。以降では空白文字のみの行は‘空白行’と表現します。
‘文字コードセット’を表す場合と‘文字コードセット内での数値’を表す場合があります。これ以降では‘数値’を表す物とします。
なお、K2Editor で内部的に扱う文字コードセットは S-JIS コードです。
本来、日本語ワープロ等での用語。基準フォントの半分の幅で表示されるものが半角文字で、基準フォントの幅で表示されるものが全角文字。
PCでは、1バイト文字を半角、2バイトを全角という場合がありますが、正しい使い方では有りません。が、この後の説明では、1バイト文字を半角、2バイト文字を全角として説明しています(笑)。
文字列の構造を表現するために使われる特殊文字の事です。(後述)
エスケープキャラクタ(\)と対になっています。通常の文字では表現できないものを表現したものです。(後述)
制御コードはこの方法で示します。
ちなみに、Parl ではエスケープシーケンスという用語を使いません(メタキャラクタと同一視する)。これ以降の説明では、いくつかの物を除きそれにしたがって表現します。
メタキャラクタで使われる文字を通常の文字として扱いたい場合には、エスケープキャラクタを前に付ける必要があります。このように、エスケープキャラクタを使って文字の意味を変えることをエスケープといいます。
厳密に言えば文字ではないのですが、文字列を表すのに必要な特殊な文字の事です。改行文字や、タブ文字などがこれにあたります。
一連の正規表現で現される文字列の事です。通常の文字もパターンに含まれます。
その1つ前の文字のことだと思ってください。グループ化(後述)した場合はそのグループを指します。
対象となる文字列が、正規表現と一致する事を指します。部分的にマッチする場合でも、こう言うことがあります。
検索してマッチすることです。ほぼマッチと同義です。
文字列内の特定の位置を表す物です。(後述)
通常はマッチするのは文字に対してですが、アンカーは位置に対してマッチします。
グループにマッチした文字列を参照すること。
通常‘後方参照’と説明されていますが、‘前方参照’という表現がされている場合があります。これらは同じ事を指しています(と思います(笑))。
「マッチした文字列を後から参照する(後ろから参照する)」から‘後方参照’で、「前にマッチした文字列を参照する(前の方を参照する)」から‘前方参照’なのでしょう。
マッチ文字列の後に続くパターンを指定すること。「Aがあとに続くB」といった指定ができます。
この場合、先読みに指定したパターンはマッチ文字列には含まれません。先の例でいうと、マッチ文字列は‘B’であって‘BA’ではありません。
マッチ文字列の前に存在するパターンを指定すること。「前にA存在するB」といった指定ができます。
この場合も先読みに指定したパターンはマッチ文字列には含まれません。先の例でいうと、マッチ文字列は‘B’であって‘AB’ではありません。
残念ながら、K2Regexp はこの機能をサポートしていません。
K2Regexpで使用されるメタキャラクタを列挙して簡単な説明をしておきます。
詳しい説明は「中級編」を参照して下さい。
ここでは以下のように分類しています。
正規表現の構造を表現するメタキャラクタ。このメタキャラクタ自体はマッチ文字列には含まれません。
特定の文字を表現するためのメタキャラクタ。
文字列内での特定の状況の位置を表現するためのメタキャラクタ。この場合の位置は文字と文字の間を表現するのでマッチ文字は空文字となります。
これで囲まれた文字のどれかとマッチします。文字は1文字ずつ分解されて判定されます。
通常のクラスの逆で、これで囲まれた文字以外とマッチします
これで囲まれた文字列は1つのまとまりとして扱われます。クラスと違い、文字ごとに判定されるのではなく、文字列全体とマッチ判定をします。
ここにマッチした文字列は後方参照(中級編以降で説明)用にキャッシュされます。
グループ化のみで、文字列の格納をしません
いわゆる「Or」です。この記号の左右の表現を並列に判定します。
平たく言うと「左右どちらか」なのですが、「a|b|c」という表現もありえます。この場合は”a, b, c のどれか”です。
ワイルドカードの*とは違いますので注意して下さい。
直前のパターンが繰り返し現れる事を現しますが、そのパターンが無くてもマッチします。
*と似ていますが、+では必ず1回は直前のパターンがないとヒットしません。
*と似ていますが、パターンが2回以上繰り返していてもそこにはマッチしません。
ワイルドカードの?とは違いますので注意して下さい。
* や + と違い、繰り返し回数を固定します。n には任意の数字を指定します。
n 回以上 m 回以下の繰り返しにマッチします。n, m は任意の数字で n < m でなければいけません。
{n}と違い、n 回以上でもマッチします。
*の最小マッチ方式の繰り返しを指示します。最小マッチに付いては上級編以降で説明します。(多分...)
+の最小マッチ方式の繰り返しを指示します。
?の最小マッチ方式の繰り返しを指示します。
{n}の最小マッチ方式の繰り返しを指示します。
{n,m}の最小マッチ方式の繰り返しを指示します。
{n,}の最小マッチ方式の繰り返しを指示します。
直前のパターンに続いて、このパターンが出現する物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。詳しくは中級編以降で説明します。
直前のパターンに続いて、このパターンが出現しない物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。詳しくは中級編以降で説明します。
コメントです。この中の物は無視されます。マッチに影響は与えません。
この中では‘)’をエスケープすることは出来ません。「\)」と書いても、そこでコメントが終了するものとみなされます。
見にくいかもしれませんが、ピリオドです。
改行以外の1文字(漢字でも)をあらわします。
制御コードの1つです。
出現位置によって意味が異なります。クラスの中で使うとバックスペース、外で使うと単語境界(後述)になります。
いわゆるタブ文字です。
改行文字です。
改ページ文字の事です。
現在このコードをプリンタに送っても改ページはしてくれませんが、一部のプリントユーティリティーでは改ページに読み替えてくれます。
K2Editorでは使用しません。
JISコードの場合、これが入る事はありますが、K2Editorで使う事は無いでしょう。
octには0〜7の数字(最大3桁)が入ります。ほとんど使う機会はないでしょう。8進数自体がWinの世界ではメジャーではないでしょうから。
「\o」と1桁でも8進エスケープを表現できますが、後方置換と同じになるため、混同しやすくなります(後方置換の方が優先順位が高い)。「\ooo」と常に3桁で書いた方が良いと思います。
hexには0〜Fの数字(最大2桁)が入ります。\octよりも使う可能性はありますが、これを必要とする事はまれだと思います。
なぜ「F」が数字なのかが分からない方は無視してもかまいません。
文字で表した制御コードというのは、Dos 窓等で[Ctrl + キー]とした時に表示される‘^C’等に近い感じです。
例をあげると、「\cK」で「垂直タブ」を表します。
英単語の構成文字にマッチします。「[0-9A-Za-z_]」と同義です。
英単語の構成文字以外にマッチします。「[^0-9A-Za-z_]」と同義です。
空白を表現する文字にマッチします。「[ \t\n\f\r]」と同義です。
空白文字以外にマッチします。「[^ \t\n\f\r]」と同義です。
数字を表現する文字にマッチします。「[0-9]」と同義です。
数字以外にマッチします。「[^0-9]」と同義です。
正規表現の中で使う時には「\num」、外で使う時には「$num」です。
グループ化したパターンにマッチした文字列はこの形で参照できます。numはそのパターンが正規表現中の何番目かを指示する数字です。
行のはじめの位置にマッチします。始めの文字ではありませんので注意して下さい。
「\n」の次(文字列があれば)には必ず「^」があることになります。
行の終端位置にマッチします。終わりの文字ではありません。
クラスの外にある場合、単語境界にマッチします。クラス内にある場合はバックスペース(前述)です。
JRE32 の頃にあった「\<」「\>」を併せ持った感じです。
単語境界以外にマッチします。
文字列の最初にマッチします。
マッチ対象文字列が複数行になっていても、その文字列の一番最初の位置にだけマッチします。
文字列の最後にマッチします。
マッチ対象文字列が複数行になっていても、その文字列の一番最後の位置にだけマッチします。