テキストと日時の操作 (2/5)
作成:2010-12-06 09:18
更新:2010-12-06 09:18
更新:2010-12-06 09:18
■正規表現について
テキストを扱う時、避けては通れないのが「正規表現」というものです。これは、「パターン」と呼ばれる、テキストの並び方の法則のようなものを用意し、それに基づいてテキストを探し出したり、置換したりする機能です。
通常の検索置換は、決まったテキストを探し出すことしかできません。例えば「"PHP"という文字を探す」というやり方ですね。これに対し、正規表現は、「どういう法則で並んだテキストか」を調べることができます。例えば「3桁の数字を検索する」とか、「aで始まりsで終わるテキストを探す」なんてことができるわけです。
正規表現のパターンは、「メタキャラクタ」と呼ばれる特殊な記号を使って組み立てます。これにはさまざまな記号とルールが用意されています。下のリストに一覧を掲載しておきました。まぁ、これを「すべてお覚える」とはいいません。実際、全部覚えて使ってる人はそんなに多くはないでしょう。よく使いそうな記号を幾つか覚えておくだけでも、正規表現のすごさは実感できるはずです。
この正規表現を利用するための関数には、いくつかのものが用意されています。とりあえずは「パターンマッチ」と「置換」のためのものを覚えておけばよいでしょう。
・パターンマッチ用関数
非常に面白いのは、3つ目の引数に用意する変数です。これは、何かの値を指定するものではありません。パターンマッチした結果が、この変数に収められるのです。これは、多次元配列の形になっていて、それぞれのマッチしたテキストの情報がまとめられます。
また、4つ目の引数として、パターンマッチに関する細かなフラグを指定することもできます。これは、本格的に正規表現を利用するようになったら調べてみてください。
・置換用関数
――とりあえず、この3つがわかればかなりいろいろなことができるようになるでしょう。パターンマッチでは、テキストデータの中から特定の要素をピックアップしたり(例えばHTMLのソースコードから<a>タグのリンクやメールアドレスだけを探し出す、なんてことができます)、置換を使えば通常の置換ではできないような複雑な置換処理ができるようになります。
通常の検索置換は、決まったテキストを探し出すことしかできません。例えば「"PHP"という文字を探す」というやり方ですね。これに対し、正規表現は、「どういう法則で並んだテキストか」を調べることができます。例えば「3桁の数字を検索する」とか、「aで始まりsで終わるテキストを探す」なんてことができるわけです。
正規表現のパターンは、「メタキャラクタ」と呼ばれる特殊な記号を使って組み立てます。これにはさまざまな記号とルールが用意されています。下のリストに一覧を掲載しておきました。まぁ、これを「すべてお覚える」とはいいません。実際、全部覚えて使ってる人はそんなに多くはないでしょう。よく使いそうな記号を幾つか覚えておくだけでも、正規表現のすごさは実感できるはずです。
この正規表現を利用するための関数には、いくつかのものが用意されています。とりあえずは「パターンマッチ」と「置換」のためのものを覚えておけばよいでしょう。
・パターンマッチ用関数
$変数 = preg_match( パターン , テキスト , $変数 );1つ目の引数のパターンを使って、2つ目のテキストを調べ、パターンにマッチする(パターンに符合するテキストが見つかる)数を返します。preg_matchは最初のパターンマッチだけを、preg_match_allはすべてのパターンマッチを調べます。
$変数 = preg_match_all( パターン , テキスト , $変数 );
非常に面白いのは、3つ目の引数に用意する変数です。これは、何かの値を指定するものではありません。パターンマッチした結果が、この変数に収められるのです。これは、多次元配列の形になっていて、それぞれのマッチしたテキストの情報がまとめられます。
また、4つ目の引数として、パターンマッチに関する細かなフラグを指定することもできます。これは、本格的に正規表現を利用するようになったら調べてみてください。
・置換用関数
$変数 = preg_replace( パターン , 置換文字 , テキスト );正規表現を使って置換を行う関数です。第1引数にはパターン、第2引数には置換する文字、そして3つ目に捜査の対象となるテキストをそれぞれ渡します。返値には、置換済みのテキストが渡されます。
――とりあえず、この3つがわかればかなりいろいろなことができるようになるでしょう。パターンマッチでは、テキストデータの中から特定の要素をピックアップしたり(例えばHTMLのソースコードから<a>タグのリンクやメールアドレスだけを探し出す、なんてことができます)、置換を使えば通常の置換ではできないような複雑な置換処理ができるようになります。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
※基本となるメタキャラクタ
\ 一般的なエスケープ文字
^ 検索対象(複数行モードでは行)の始まり
$ 検索対象(複数行モードでは行)の終わり
. 改行を除く全ての文字にマッチ
[] 文字クラス
| 選択枝の開始
() サブパターン
? ( の意味を拡張、0 または1 回の繰り返し、繰り返しのを最小化
* 0以上の繰り返し
+ 1以上の繰り返し
{} 最小/最大繰り返しの指定
※文字クラス内で利用できる特殊な文字
\ エスケープ文字
\b バックスペース
\f 改頁
\n リターン(改行)
\r ラインフィード
\t タブ文字
\d 数字
\s 空白扱いの文字(半角スペース、改行、ラインフィード、タブ文字)
\w 数字+アルファベット+アンダースコア
^ 否定
- 範囲
(※この内、^-以外は文字クラス外でも利用可)
※文字クラス外で利用する特殊な文字
\a アラーム
\c コントロール記号(この後にキャラクタを指定)
\e エスケープ
\D 数字以外すべて
\S 空白扱いの文字以外すべて
\W 「数字+アルファベット+アンダースコア」以外すべて
\b 単語の区切り
\B 単語の区切り以外
\A テキストの先頭
\Z テキストの終端または改行
\z テキストの終端
\ddd 8進数でdddの文字
\xhh 16進数でhhの文字
※パターン修飾子
i パターンの中の文字は 大文字にも小文字にもマッチ
m 検索対象文字列を単一の行からなるとして処理
s .を改行を含む全ての文字にマッチ
x 空白文字を無視
e preg_replace() は、PHPコードとして評価
A 先頭にのみマッチ
D $を終わりにのみマッチ
S より時間をかけた解析を行う
U マッチの最短・最長の方式を逆にする
X Perl非互換機能の利用
u パターンをUTF-8とする
(※これらはパターンの性質を修飾するもので、パターンには含まれない)
※関連コンテンツ