正規表現
文字列の処理はCGIでもかなり重要で、フォームから送られた文字列から特定の文字列を抽出したり、ある特定のパターンにマッチする文字列の場合に処理を行ったりと、色々な事例が考えられます。
こう言った処理によく使われるのが「正規表現」で、Perlにはこれらを活用する為のいくつかの演算子が用意されています。
1文字にマッチするパターン
マッチする文字が、ある特定の文字1文字の場合は、正規表現としてその文字自体を使います。使い方には、以下のようなケースがあります。
(1)例えば「a」が含まれる文字列をマッチさせたい時。
/ a /
(2)ある1文字と任意の1文字とをマッチさせたい時は、ドット「.」を使います。
/ a. /
(3)ある複数の文字の中のどれかにマッチすればよいと言う時。
[abc]
(4)何らかの数字1文字にマッチする場合は、「-」を使って省略して記述する事も出来ます。
[0-9]
(5)また「含まれていない場合」と言う否定的な指定をする場合には、「^」を使います。
[^0-9]
(6)これ以外に略記法による指定も出来ます。主なものは以下の通りです。
略記法
文字クラス
意味
\w [a-zA-Z0-9_] アルファベット、数字、下線 \W [^a-zA-Z0-9_] アルファベット、数字、下線以外 \s [\r\t\n\f] 空白文字(スペース、復帰文字、タブ、改行文字、ラインフィード) \S [^\r\t\n\f] 空白文字以外 \d [0-9] 数字 \D [^0-9] 数字以外 複数の文字にマッチ
複数の文字列にマッチするかどうか確認したい場合、例えば「img」で始まり後に数字が付いているような文字列をまとめてマッチさせたい場合は以下のように書きます。
/ img[0-9]* /
ここの最後にある「*」はアリタリスクで、「0回以上にマッチする」と言う意味を表します。このような記号を「量指定子」と呼び、以下のようなものがあります。
記号
マッチ回数
* 0回以上にマッチ + 1回以上にマッチ ? 0回、1回にマッチ {m} ちょうどm回にマッチ {m,} m回以上にマッチ {m,n} m回以上、n回以下にマッチ マッチする長さの指定
以下のような文字列の場合、/ .*is /と記述するとどこまでがマッチするのでしょうか。最初の「This」まででしょうか、それとも2つ目の「This」まででしょうか。そこでPerlでは、最短でマッチすると言う指定を「?」を使って出来ます。
This is a desk. This is a book.
「*?」「+?」と言うように、前項の各記号の後ろに「?」をつけてやればいいだけです。ただし、この最短マッチが使用できるのはPerl5以降です。
マッチする場所の指定
Perlでは、マッチする場所を指定することが出来ます。これを位置指定子と言い、以下のようなものがあります。
位置指定子
意味
^ 文字列(行)の最初にマッチする。 $ 文字列(行)の最後にマッチする。 \b 単語の境界にマッチする。 \B 単語の境界以外にマッチする。 \A 文字列の最初にマッチする。(Perl5のみ) \z 文字列の最後にマッチする。(Perl5.005以降) マッチ演算子
マッチ演算子とは、ある文字列が正規表現で表されたパターンにマッチするかどうかを調べる演算子です。この演算子は、マッチした時には真を、マッチしない時には偽(空文字)を返します。戻り値が真・偽となりますから、通常はif文やwhile文と共に使います。マッチ演算子の書式は以下のようになります。
/ 正規表現 /[修飾子]
マッチしているかどうかを調べる対象は[$_]に入っている文字列で、パターン結合演算子(後述)を使うとスカラー変数を対象と出来ます。[修飾子]には、以下のようなものがあります。
修飾子
意味
g マッチするもの全てを見つける。 i 大文字と小文字を区別しない。 m 文字列を複数行として扱う。 o 変数展開を1回行う。 s 文字列を単一行として扱う。 x 拡張正規表現を使用する。 置換演算子
正規表現で表されたパターンにマッチした文字列を置換します。置換演算子の書式は以下の通りです。
s/ 正規表現 / 置換文字列 /[修飾子]
通常の置換対象は[$_]に入っている文字列です。パターン結合演算子(後述)を使うとスカラー変数を対象と出来ます。
(例)s/</</・・・「<」を「<」に置換します。
[修飾子]には、以下のようなものがあります。
修飾子
意味
e 置換文字列を式とみなし実行する。 g マッチするもの全てを見つける。 i 大文字と小文字を区別しない。 m 文字列を複数行として扱う。 o 変数展開を1回だけ行う。 s 文字列を単一行として扱う。 x 拡張正規表現を使用する。 変換演算子
文字列の変換や削除を行います。置換演算子との違いは、変換対象をリストアップするのに正規表現を使わない点です。変換演算子の書式は以下の通りです。
tr/ 変換対象の文字リスト / 変換する文字リスト /
通常の置換対象は[$_]に入っている文字列です。パターン結合演算子(後述)を使うとスカラー変数を対象と出来ます。
パターン結合演算子
マッチ演算子、置換演算子、変換演算子は通常入力としてグローバル変数である[$_]が使われます。しかし、[$_]以外のスカラー変数に入っている文字列を$_に代入するのは面倒です。そこで用いるのが、このパターン結合演算子「=~」です。これはスカラー変数(式)とマッチ演算子、置換演算子、変換演算子とを結合します。パターン結合演算子の書式は以下の通りです。
<スカラー変数(式)> =~ <マッチ演算子、置換演算子、変換演算子>
(例)$input =~ s/</</g・・・スカラー変数$input中の「<」全てを「<」に置換します。
区切り文字を変える
マッチ演算子、置換演算子などは区切り文字としてスラッシュ「/」を使っていますが、UNIXのパスを置換演算子に入れる場合などは非常に見にくくなってしまいます。Perlではこう言った問題を解決する為に、区切り文字を変える事が出来ます。マッチ演算子の区切り文字を変えた場合は以下のようになります。
m <区切り文字> 正規表現 <区切り文字>
区切り文字には「@」「#」「*」「[ ]」と言ったものを使う事が出来ます。
最後に
この章の内容は、実際のPerlスクリプトの中の文字列操作などで多用する事項ですから、しっかり理解しておく必要があります。しかし、各処理部分はほとんど定型化されていますので、ご心配は無用です。
演算子 前へ
次へ 処理の制御