[Perl] プログラム言語 Perl についての覚え書き

正規表現

Last Update: 2003--0-5- (Mon) 20: 1

演算子やらメタ文字やら色々覚えなきゃいけない事が多い正規表現の解説。

文字クラス

-    範囲
^    先頭に置くとそれ以外にマッチ
/[01234567]/ 0~7 までの数字 1 文字にマッチ /[0-9\-]/ 数字 1 文字かマイナス文字 1 文字にマッチ /[^0-9]/ 数字以外の 1 文字にマッチ /[a-zA-Z]/ 英字 1 文字にマッチ /[0-9]+/ 1 文字以上の数字にマッチ

メタ文字

.       改行を除く任意の 1 文字
*       0 回以上のパターンの繰り返し
+       1 回以上のパターンの繰り返し
?       0 または 1 回のパターン
^       行の先頭
$       行の終端又は行末の改行の直前
\       直後のメタ文字をクォート
|       パターン論理和
()      グループ化
[]      文字クラス
{}      量指定子
\t タブ \n 改行 \r リターン \f 改ページ \e エスケープ
\l 直後の文字を小文字にする \u 直後の文字を大文字にする \L \E まで小文字にする \U \E まで大文字にする \Q \E まで正規表現演算子をクォート \E
\d 数字 [0-9] \D 数字以外 [^0-9] [^\d] \w 単語 [_a-zA-Z0-9] \W 単語以外 [^_a-zA-Z0-9] [^\w] \s 空白 \S 空白以外
\b 単語境界 \w、\W の間 \B 単語境界以外

量指定子

*           0 回以上のパターンの繰り返し
+           1 回以上のパターンの繰り返し
?           0 または 1 回のパターン
{n}         n 回の繰り返しにマッチ
{n,}        少なくとも n 回のある繰り返しにマッチ
{n, m}      n 回から m 回の繰り返しにマッチ

デフォルトでは可能な限り大きな繰り返しにマッチしようとするので、可能な限り小さな繰り返しにマッチさせる場合は、量指定子のあとに ? をつけます。

{n}?        n 回の繰り返しにマッチ
{n,}?       少なくとも n 回のある繰り返しにマッチ
{n, m}?     n 回から m 回の繰り返しにマッチ

特殊変数

$n     () の中の n 番目にマッチした文字列
$&     正規表現とマッチした部分
$`     マッチした部分より前の文字列
$'     マッチした部分より後ろの文字列
$+     () で囲んだ部分で最後にマッチした文字列

置換演算子

s/パターン/置換文字列/
e 置換文字列を式として結果を返す g マッチするものを全て見付ける i 大文字・小文字の違いを無視する s 文字列を単一行として処理 m 文字列を複数行として処理 o 変数展開を 1 回だけ行う x 空白とコメントを許可
s/perl//g; # 全ての perl を削除 s/PERL/lrep/i; # PERL を lrep に置換 s/</&lt;/g; # < を &lt; に置換 s/(\d)(\d)/$1*$2/e; # 二つの整数の乗算の結果

マッチ演算子

m は省略可能です。

m/マッチパターン/
g マッチするものを全て見付ける i 大文字・小文字の違いを無視する s 文字列を単一行として処理 m 文字列を複数行として処理 o 変数展開を 1 回だけ行う x 空白とコメントを許可
/[\w]{5,}/ # 英字 5 文字以上にマッチ m/[0-9]{1, 2}/ # 0 ~ 99 にマッチ next if(m/^$/); # 空行なら next

変換演算子

tr/対象文字列/変換文字列/
c 対象文字列に含まれないものを変換 d 変換文字列に含まれないものを削除 s 連続した文字を 1 文字に変換
tr/A-Z/a-z/; # 英大文字を小文字に変換 tr/0-9a-zA-Z/_/c; # 英数字以外を _ に変換 tr/0-9//cd; # 数字以外を削除 tr/a//s; # 連続した a を 1 つにする

Posted by Kyosuke Takayama at 2003-05-20 (Tue) 13:22 printable version

この記事へのコメント

1) さくらんぼ (2006-08-06 (Sun) 01:04)

perlでデータを一行ずつようんでいき、
「数字と大英字で組み合わされた文字列だったら~~に格納する」
というような文をif文で作ることは無理でしょうか。。。。

パターンマッチでやろうと思ったのですが、メタ文字などを
みても見つからなくてメールしてみました。

2) takayama (2006-08-07 (Mon) 10:12)

if(/^[\dA-Z]+$/)
こんな感じで良いのでしょうか。
これだと英大文字か数字のどちらかが入ってれば通りますけど。

実際はこんな感じになるのかなあ。なんかもっと良いやり方がありそうな気もしますけどわかんないです。
if(/^[\dA-Z]+$/ and /\d/ and /[A-Z]/);

コメントはお気軽にどうぞ

Cookie に保存しますか?


・スパム対策のため、http:// を含むコメントの投稿は出来ません。
・スパムチェックのため、投稿がすぐに反映されない場合があります。
・メールアドレス入力欄には何も入力しないでください。

トラックバック

トラックバックURL: http://espion.just-size.jp/mt-tb.cgi/23


この記事のリンク元

 
Copyright (C) Kyosuke Takayama, All rights reserved.