正規表現
正規表現は
- 文字列が特定の条件に一致するかどうかの判断
- 文字列から特定の文字列を抜き取る
- 文字列の特定部分を置換する
などに使います。
文字列の検索には
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 | ヌル文字 |
\777 | 8進数のASCII値 |
\xff | 16進数の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) | 後続文字列のみに修飾子を適用する。解除したい場合は修飾子につづけて-をつける。 |
主に、前後の文字列を評価するが、
前後の部分は一致部分に含めない場合に使います。
関連