正規表現の解説 初級編

目次へ戻る次へ

正規表現って何?

正規表現は英語の "Regular Expression" の訳です。文字列のパターンを表現するために使われます。
(正式な定義がどうなっているのかは知りませんので、正しい表現ではないかもしれません)

正規表現はUNIXの世界では古くから使われてきました。テキストデータの加工をするツールでは、大抵正規表現が使えるようです。

Windows(DOS)の世界では、ワイルドカードがよく使われてきましたが、正規表現の方が細かい指定が可能です。その分難しい(奥が深い)のも事実ですが。

元々は数学系の用語のようで、その場合正則表現という訳になるようです。もちろん、この場合上記の定義は嘘になります。テキスト処理のための解説なので、細かいことは許してください(笑)

目次へ戻るページの先頭に戻る

正規表現の専門用語

このページで使っている正規表現についての用語のうち、分かり難そうな単語について簡単に説明しておきます。

キャラクタ

文字の事です(分かってるって?(笑))。ちゃんと日本語で書けよという方、正論です。ただ、正論は時によっては極論でもあります。

文字列

文字の集合の事です(そのまんまですが(笑))。

ちなみに「何も文字を含まない」場合でも「文字列」とみなされます。それを区別したい時には「空文字列」(又は、単に「空文字」)といいます。

テキスト

文字列の集合の事(笑)

英単語

半角英数字文字とアンダースコア(_)で構成された文字列の事です。実際の英単語として機能しないもの(aaaなど)も含みます。

空白文字

空白として認識される文字。

通常の使用では、半角スペースとタブ文字がこれにあたります。漢字を使う場合、全角スペースも含むかもしれません。場合によってはフォームフィードや、垂直タブもそうでしょう。

HTML的に言えば、改行コードも空白文字かもしれません。

ここでは簡単に、K2Editorで空白として表示されるものだと思ってもらってもいいと思います。正規表現的には「\s」で表されるものです。(後述)

空行

行頭から行末の間に文字が無い行。つまり、改行のみの行の事。

空白文字のみの行も含むことがあります。以降では空白文字のみの行は‘空白行’と表現します。

文字コード

‘文字コードセット’を表す場合と‘文字コードセット内での数値’を表す場合があります。これ以降では‘数値’を表す物とします。

なお、K2Editor で内部的に扱う文字コードセットは S-JIS コードです。

半角/全角

本来、日本語ワープロ等での用語。基準フォントの半分の幅で表示されるものが半角文字で、基準フォントの幅で表示されるものが全角文字。

PCでは、1バイト文字を半角、2バイトを全角という場合がありますが、正しい使い方では有りません。が、この後の説明では、1バイト文字を半角、2バイト文字を全角として説明しています(笑)。

メタキャラクタ

文字列の構造を表現するために使われる特殊文字の事です。(後述)

エスケープシーケンス

エスケープキャラクタ(\)と対になっています。通常の文字では表現できないものを表現したものです。(後述)

制御コードはこの方法で示します。

ちなみに、Parl ではエスケープシーケンスという用語を使いません(メタキャラクタと同一視する)。これ以降の説明では、いくつかの物を除きそれにしたがって表現します。

エスケープ

メタキャラクタで使われる文字を通常の文字として扱いたい場合には、エスケープキャラクタを前に付ける必要があります。このように、エスケープキャラクタを使って文字の意味を変えることをエスケープといいます。

制御コード

厳密に言えば文字ではないのですが、文字列を表すのに必要な特殊な文字の事です。改行文字や、タブ文字などがこれにあたります。

パターン

一連の正規表現で現される文字列の事です。通常の文字もパターンに含まれます。

直前のパターン

その1つ前の文字のことだと思ってください。グループ化(後述)した場合はそのグループを指します。

マッチ

対象となる文字列が、正規表現と一致する事を指します。部分的にマッチする場合でも、こう言うことがあります。

ヒット

検索してマッチすることです。ほぼマッチと同義です。

アンカー

文字列内の特定の位置を表す物です。(後述)

通常はマッチするのは文字に対してですが、アンカーは位置に対してマッチします。

後方参照(前方参照)

グループにマッチした文字列を参照すること。

通常‘後方参照’と説明されていますが、‘前方参照’という表現がされている場合があります。これらは同じ事を指しています(と思います(笑))。

「マッチした文字列を後から参照する(後ろから参照する)」から‘後方参照’で、「前にマッチした文字列を参照する(前の方を参照する)」から‘前方参照’なのでしょう。

先読み(lookahead)

マッチ文字列の後に続くパターンを指定すること。「Aがあとに続くB」といった指定ができます。

この場合、先読みに指定したパターンはマッチ文字列には含まれません。先の例でいうと、マッチ文字列は‘B’であって‘BA’ではありません。

後読み(lookbehind)

マッチ文字列の前に存在するパターンを指定すること。「前にA存在するB」といった指定ができます。

この場合も先読みに指定したパターンはマッチ文字列には含まれません。先の例でいうと、マッチ文字列は‘B’であって‘AB’ではありません。

残念ながら、K2Regexp はこの機能をサポートしていません。

目次へ戻るページの先頭に戻る

メタキャラクタ

K2Regexpで使用されるメタキャラクタを列挙して簡単な説明をしておきます。

詳しい説明は「中級編」を参照して下さい。

ここでは以下のように分類しています。

目次へ戻るページの先頭に戻る

制御表現

[...]
キャラクタをクラス化する

これで囲まれた文字のどれかとマッチします。文字は1文字ずつ分解されて判定されます。

[^...]
キャラクタを否定クラス化する

通常のクラスの逆で、これで囲まれた文字以外とマッチします

(...)
パターンのグループ化

これで囲まれた文字列は1つのまとまりとして扱われます。クラスと違い、文字ごとに判定されるのではなく、文字列全体とマッチ判定をします。

ここにマッチした文字列は後方参照(中級編以降で説明)用にキャッシュされます。

(?:...)
パターンの非格納グループ化

グループ化のみで、文字列の格納をしません

|
パターンの論理和

いわゆる「Or」です。この記号の左右の表現を並列に判定します。

平たく言うと「左右どちらか」なのですが、「a|b|c」という表現もありえます。この場合は”a, b, c のどれか”です。

*
直前のパターンの0回以上の繰り返し

ワイルドカードの*とは違いますので注意して下さい。

直前のパターンが繰り返し現れる事を現しますが、そのパターンが無くてもマッチします。

+
直前のパターンの1回以上の繰り返し

*と似ていますが、+では必ず1回は直前のパターンがないとヒットしません。

?
直前のパターンが0回または1回現われる

*と似ていますが、パターンが2回以上繰り返していてもそこにはマッチしません。

ワイルドカードの?とは違いますので注意して下さい。

{n}
直前のパターンのちょうど n 回の繰り返し

* や + と違い、繰り返し回数を固定します。n には任意の数字を指定します。

{n,m}
直前のパターンの n 回から m 回の繰り返し

n 回以上 m 回以下の繰り返しにマッチします。n, m は任意の数字で n < m でなければいけません。

{n,}
直前のパターンの n 回以上の繰り返し

{n}と違い、n 回以上でもマッチします。

*?
直前のパターンの0回以上の繰り返し

*の最小マッチ方式の繰り返しを指示します。最小マッチに付いては上級編以降で説明します。(多分...)

+?
直前のパターンの1回以上の繰り返し

+の最小マッチ方式の繰り返しを指示します。

??
直前のパターンが0回または1回現われる

?の最小マッチ方式の繰り返しを指示します。

{n}?
直前のパターンのちょうど n 回の繰り返し

{n}の最小マッチ方式の繰り返しを指示します。

{n,m}?
直前のパターンの n 回から m 回の繰り返し

{n,m}の最小マッチ方式の繰り返しを指示します。

{n,}?
直前のパターンの n 回以上の繰り返し

{n,}の最小マッチ方式の繰り返しを指示します。

(?=...)
先読み

直前のパターンに続いて、このパターンが出現する物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。詳しくは中級編以降で説明します。

(?!...)
否定先読み

直前のパターンに続いて、このパターンが出現しない物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。詳しくは中級編以降で説明します。

(?#Text)
コメント

コメントです。この中の物は無視されます。マッチに影響は与えません。

この中では‘)’をエスケープすることは出来ません。「\)」と書いても、そこでコメントが終了するものとみなされます。

略記表現

.
改行を除く任意の1文字

見にくいかもしれませんが、ピリオドです。

改行以外の1文字(漢字でも)をあらわします。

\a
アラーム(ベル:BEL)

制御コードの1つです。

\b
バックスペース(後退:BS)

出現位置によって意味が異なります。クラスの中で使うとバックスペース、外で使うと単語境界(後述)になります。

\t
タブ(水平タブ:HT)

いわゆるタブ文字です。

\n
改行(ラインフィード:LF)

改行文字です。

\f
改ページ(書式送り フォームフィード:FF)

改ページ文字の事です。

現在このコードをプリンタに送っても改ページはしてくれませんが、一部のプリントユーティリティーでは改ページに読み替えてくれます。

\r
復帰(キャリッジリターン:CR)

K2Editorでは使用しません。

\e
エスケープ(拡張:ESC)

JISコードの場合、これが入る事はありますが、K2Editorで使う事は無いでしょう。

\oct
8進数であらわした文字コードで示される文字(8進エスケープ)

octには0〜7の数字(最大3桁)が入ります。ほとんど使う機会はないでしょう。8進数自体がWinの世界ではメジャーではないでしょうから。

「\o」と1桁でも8進エスケープを表現できますが、後方置換と同じになるため、混同しやすくなります(後方置換の方が優先順位が高い)。「\ooo」と常に3桁で書いた方が良いと思います。

\xhex
16進数であらわした文字コードで示される文字(16進エスケープ)

hexには0〜Fの数字(最大2桁)が入ります。\octよりも使う可能性はありますが、これを必要とする事はまれだと思います。

なぜ「F」が数字なのかが分からない方は無視してもかまいません。

\cchar
文字で表した制御コード

文字で表した制御コードというのは、Dos 窓等で[Ctrl + キー]とした時に表示される‘^C’等に近い感じです。

例をあげると、「\cK」で「垂直タブ」を表します。

\w
英単語構成文字

英単語の構成文字にマッチします。「[0-9A-Za-z_]」と同義です。

\W
英単語構成文字以外

英単語の構成文字以外にマッチします。「[^0-9A-Za-z_]」と同義です。

\s
空白文字

空白を表現する文字にマッチします。「[ \t\n\f\r]」と同義です。

\S
空白文字以外

空白文字以外にマッチします。「[^ \t\n\f\r]」と同義です。

\d
数字

数字を表現する文字にマッチします。「[0-9]」と同義です。

\D
数字以外

数字以外にマッチします。「[^0-9]」と同義です。

\num, $num
後方参照

正規表現の中で使う時には「\num」、外で使う時には「$num」です。

グループ化したパターンにマッチした文字列はこの形で参照できます。numはそのパターンが正規表現中の何番目かを指示する数字です。

アンカー

^
行頭

行のはじめの位置にマッチします。始めの文字ではありませんので注意して下さい。

「\n」の次(文字列があれば)には必ず「^」があることになります。

$
行末

行の終端位置にマッチします。終わりの文字ではありません。

\b
単語境界

クラスの外にある場合、単語境界にマッチします。クラス内にある場合はバックスペース(前述)です。

JRE32 の頃にあった「\<」「\>」を併せ持った感じです。

\B
単語境界以外

単語境界以外にマッチします。

\A
文字列の最初

文字列の最初にマッチします。

マッチ対象文字列が複数行になっていても、その文字列の一番最初の位置にだけマッチします。

\Z
文字列の最後

文字列の最後にマッチします。

マッチ対象文字列が複数行になっていても、その文字列の一番最後の位置にだけマッチします。

目次へ戻るページの先頭に戻る 次へ