師匠の散歩

きままにPerlでも

マッチいろいろ

いろんなマッチの情報を集める/ subMatch.cgi

マッチテクニック

マッチ、置換、削除、正規表現、メタ文字の情報を集めスクラップブック状態とする。完全コピーなので、参照先も掲載する。よく使うものは、モジュールに関数を実装してもいいかもしれない。

http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm
■マッチパターン演算子

  i     大文字、小文字の区別なし
  s     単一行として処理 (^、$ は、
 を無視)
  m     複数行として処理 (^、$ は、行先頭、行末尾)
  x     空白を無視、# をコメント処理

■メタ文字

  .     改行を除く任意の 1 文字
  *     0 回以上のパターン繰り返し
  +     1 回以上のパターン繰り返し
  ?     0 または 1 回のパターン
  ^     先頭から
  \尾から
  \     メタ文字クォート
  |     パターン論理和
  ()    パターングループ
  []    文字クラス
  {}    量指定子

  \0    null文字
  \12   8進数のASXII値にマッチ
  \x811 16進数のASXII値にマッチ
  \a    アラーム
  \c    制御文字
  \e    エスケープ
  \n    newline            ASCII(\x0x) でも指定可
  \r    return             ASXII(\x0d) でも指定可
  \f    form feed          ASCII(\x0c) でも指定可
  \t    タブ                 ASCII(\x09) でも指定可
  \d    数字 [0-9]                    文字クラスでも指定可
  \D    数字以外 [^0-9]
  \w    英数字単語 [_a-zA-Z0-9]       文字クラスでも指定可
  \W    英数字単語以外 [^_a-zA-Z0-9]
  \s    空白 [ \t\n\r\f]              文字クラスでも指定可
  \S    空白以外 [^ \t\n\r\f]
  \b    単語境界 \w、\W の間          文字クラスでも指定可
  \B    単語境界以外
  \x??  16 進数
  
  \E    大文字、小文字変換の終了
  \l    次の文字を小文字に変換
  \L    までを小文字に変換
  \Q    までのパターン指定メタ文字の意味を打ち消す
  \u    次の文字を大文字に変換
  \U    までを大文字に変換

■文字クラス

  -     範囲
  ^     先頭に置くと以外にマッチ

  /[0123456789]/        数字にマッチ
  /[0-9]/               数字にマッチ
  /[^0-9]/              数字以外にマッチ
  /[a-zA-Z]/            英字にマッチ
  /[a-fA-F\d]/          16 進数にマッチ

■量指定子

  {}?   最短マッチ(? がないと最長マッチになる)

  *                     0 回以上のパターン繰り返し
  +                     1 回以上のパターン繰り返し
  ?                     0 または 1 回のパターン
  {n}?                  n 回繰り返しマッチ
  {n,}?                 n 回以上繰り返しマッチ
  {n, m}?               n 回以上、m 回以下繰り返しマッチ

■例

  /abc/                 abc にマッチ
  /a.c/                 a?c にマッチ
  /a(bb|b1|b2)c/        abbc、ab1c、ab2c にマッチ
  /^abc/                abc で始まるとマッチ
  /abc\
                abc で終わるとマッチ
  /^\
                  空行とマッチ
  /ab?c/                ac、abc にマッチ
  /a.*c/                ac、abc、ab1c などにマッチ
  /a.+c/                abc、ab1c などにマッチ
  /[0-9]{1, 2}/         0 〜 99 にマッチ
  /[a-zA-Z]{8,}/        英字 8 文字以上にマッチ
  /あいうえお{2}/       「あいうえおお」にマッチ
  /(あいうえお){2}/     「あいうえおあいうえお」にマッチ

■マッチ演算子

  m/マッチパターン/

  c     g と併せて使用し、失敗時の位置リセット禁止
  g     マッチするものすべて
  i     大文字、小文字の区別なし
  s     単一行マッチ
  m     複数行マッチ
  o     パターンコンパイル
  x     空白を無視、# をコメント処理

  $1, $2, ...  () の n 番目マッチ文字列
  $&           正規表現マッチ部分
  $`           マッチ部分の前
  $'           マッチ部分の後
  $+           最後の () にマッチした文字列

  if ($s =~ m/abc/i) { マッチ処理; }

■置換演算子

  s/マッチパターン/置換文字列/

  e     置換文字列を式とする
  g     マッチするものすべて
  i     大文字、小文字の区別なし
  s     単一行マッチ
  m     複数行マッチ
  o     パターンコンパイル
  x     空白を無視、# をコメント処理
  ee    式の右側の評価を行い、実行後の戻り値を再度評価する

  $s =~ s/abc/123/i;        #// abc を 123 に
  $s =~ s/</&lt;/g;     #// %lt; を $lt; に
  $s =~ s/(.)\1/$1/g;       #// 連続文字を 1 文字に
  $s =~ s/abc//g;           #// abc を削除(指定文字を取り除く)
  $s =~ s/@//g;            #// @ マークを削除

#// 教えてもらった凝ったやつ1 (_?_...__ にマッチ)
  $s = '_a_あい_うえお__かきくけこ_b_さしすせそ__';
  $s =~ s/_._([^_]+|([^_]+_[^_]+)+)__/start$1end/g;

startあい_うえおendかきくけこstartさしすせそend

#// 教えてもらった凝ったやつ2 (最短マッチを使う手 Perl5 以降)
  $s = '_a_あい_うえお__かきくけこ_b_さしすせそ__';
  $s =~ s/_._([\s\S]*?)__/start$1end/g;

startあい_うえおendかきくけこstartさしすせそend

■変換演算子

  tr/対象リスト/変換リスト/

  c     対象リストに含まれないものを変換
  d     変換リストに含まれないものを削除
  s     連続文字を 1 文字に変換

  $s =~ tr/A-Z/a-z/;        #// 英子文字に変換
  $s =~ tr/0-9a-zA-Z/_/c;   #// 英数字以外を _ に変換
  $s =~ tr/a-zA-Z//d;       #// 英字を削除
  $s =~ tr/a-zA-Z//cd;      #// 英字以外を削除

■grep

  @rec = grep(/abc/, @rec);
  @rec = grep(/マッチパターン/, @rec);

  @rec = grep {/abc/} @rec;
  @rec = grep {論理式} @rec;

http://www2u.biglobe.ne.jp/MAS/perl/waza/trim.html
■前後のスペースを削除する
$val =~ s/^ *(.*?) *$/$1/;

■スペースだけではなくタブなどの空白文字を削除
$val =~ s/^s*(.*?)s*$/$1/;

■先頭だけや末尾だけ削除
$val =~ s/^s*//; # 先頭
$val =~ s/s*$//; # 末尾
http://7ujm.net/Perl/perl2.html
■正規表現
 . 一文字のワイルドカード
 * 直前の文字が0個以上の繰り返し
 ? 直前の文字が0個または1個
 + 直前の文字の1回以上の繰り返し
 ^ 行頭にマッチ
 $ 行末にマッチ
 [ ] 特定の文字と一致
 [a-z]ならaからzにマッチ
 | 複数パターンのいずれか
 ( ) グループ化
 \ 直後の文字をエスケープ 
 
http://www.din.or.jp/%7Eohzaki/perl.htm#JP_RmSpace
■前後の空白文字(全角スペース含)を削除する

# 先頭
$str =~ s/^(?:\s|$Zspace)+//o;                            # $str が EUC-JP の場合
$str =~ s/^(?:\s|$Zspace_sjis)+//o;                       # $str が SJIS の場合

# 末尾
$str =~ s/^($character*?)(?:\s|$Zspace)+$/$1/o;           # $str が EUC-JP の場合
$str =~ s/$eucpre(?:\s|$Zspace)+$//o;                     # $str が EUC-JP の場合(perl5.005以降)
$str =~ s/^($character_sjis*?)(?:\s|$Zspace_sjis)+\
$1/o; # $str が SJIS の場合
http://www.rfs.jp/sb/perl/02/09.html
s/// 演算子はきめの細かい置換が行えますが、文字数の計算や、重複する文字の削除は tr/// のほうが高速です。

subMatch.cgi // Topに戻る // indexに戻る
Copyright(C) 2009-2021 Grandmaster Last up : 2020/09/18