Perlリファレンス

正規表現







正規表現


正規表現は
  • 文字列が特定の条件に一致するかどうかの判断
  • 文字列から特定の文字列を抜き取る
  • 文字列の特定部分を置換する
などに使います。

文字列の検索にはm//
置換にはs///
を使います。
m//は省略して//と記述できます。
文字列ではなく1文字を置換したい場合にはtr///を使う。

検索対象の文字列は
=~!~を使った場合は左側の文字列
使わなかった場合は$_が対象になる。


print "一致" if($str=~/abc/);
$strに'abc'という文字が含まれている場合は'一致'と表示される。

以下の文字は対象の文字にマッチします。
.改行以外のすべての文字
\d数字
\D数字以外の文字
\w英字又は数字又はアンダーバー
\W英字又は数字又はアンダーバー以外の文字
\sスペース又はタブ又は改行
\Sスペース又はタブ又は改行以外の文字
\aアラーム
\c制御文字
\eエスケープ文字
\f改ページ
\n改行
\r復帰文字
\tタブ
\0ヌル文字
\7778進数のASCII値
\xff16進数のASCII値

print "一致" if($str=~/\d/);
$strに数字が含まれている場合は'一致'と表示される。

[と]で複数の文字を囲むといずれかの文字にマッチします。

print "一致" if($str=~/[abc]/);
$strに'a'、'b'、'c'のいずれかの文字が含まれている場合は'一致'と表示される。
  • で範囲の指定ができます。

print "一致" if($str=~/[a-z]/);
$strに'a'-'z'のいずれかの文字が含まれている場合は'一致'と表示される。

[^と]で囲むと含まれない文字すべてにマッチします。

print "一致" if($str=~/[^abc]/);
$strに'a'、'b'、'c'の以外の文字が含まれている場合は'一致'と表示される。

で区切るといずれかの文字列にマッチする

print "一致" if($str=~/abc|def|ghi/);
$strに'abc'、'def'、'ghi'のいずれかの文字が含まれている場合は'一致'と表示される。

(と)で囲むと一致部分が記録される

$str='abcdefg';
$str=~/(cde)/;
$1に一致部分の'cde'が代入される。
()が複数ある場合は$2、$3・・・となる。

量指定子
?0個又は1個
*0個以上
+1個以上
{m}m個
{m,}m個以上
{m,n}m個以上n個以下
量指定子により直前の文字の複数連続又は0個に一致させられます。

$str='abc123'
$str=~/(\d+)/;
$1に'123'が代入される。

正規表現では、一致パターンが複数ある場合、基本的に長い方に一致します。

$str='abcdef abcdef';
$str=~/ab(.*)ef/;
こんな感じだと、
$1は'cdef abcd'となります。
$str='abcdef abcdef';
$str=~/ab(.*?)ef/;
量指定子の後ろに「?」をつけると、最短マッチとなり、
$1は'cd'となります。


位置指定子
^先頭(行頭)
$終端(行末)
\A先頭
\Z終端
\bワードの区切り
\Bワードの区切り以外
\G文字列の先頭、もしくは修飾子 g がついたパターンマッチングが終了した場所
^と$は行頭、行末と説明されてることが多いですが、mオプションをつけない場合は行頭、行末にはなりません。(mオプションがなければ、文字列の先頭、終端となる。)

print "一致" if($str=~/^\d+$/);
$strが数字のみの1文字以上の場合'一致'と表示される。

拡張構文
(?#コメント)正規表現内にコメントを入れる際に使います。
(?:式)(式) と同様にグループ化します。ただし、$nに代入されない。
(?=式)式に一致すれば手前の文字列がマッチする。
(?!式)(?=式)の否定形
(?<=式)式に一致すれば後ろの文字列がマッチする。
(?<!式)(?<=式)の否定形
(?ismx)後続文字列のみに修飾子を適用する。解除したい場合は修飾子につづけて-をつける。
主に、前後の文字列を評価するが、
前後の部分は一致部分に含めない場合に使います。


関連






[編集] [新規] [削除] [バックアップ] [アップロード] [ログイン] [管理]
whwiki 1.3