perl > regex


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

正規表現

m演算子

mからはじまるマッチング。検索パターンの指定に使う。
m/regex/[修飾子]
mの修飾子の種類
i 大文字と小文字を区別しない
m 文字列を複数行として扱う。(^と$が改行ごとにマッチする)
o パターンのコンパイルを一度しか行わない
s 文字列を単一行として扱う。(^と$が最初と最後にしかマッチしない)
x 拡張正規表現をつかう。(空白を無視するようになる。エスケープと[ ]以外)
g すべてのマッチを行う。配列でとればマッチしたものがとれ、スカラでとれば、true or falseがとれる
mの後をスラッシュ/以外にすれば、それがデリミタとなります。
逆にデリミタを変えないのであれば、mはいらない。

s演算子

sからはじまるマッチング。置換処理に使う。
これもデリミタの変更OK。
s/regex/replaceto/[修飾子]
sの修飾子の種類
e replacetoの式を評価する(足し算とか)
i 大文字と小文字を区別しない
m 文字列を複数行として扱う。(^と$が改行ごとにマッチする)
o パターンのコンパイルを一度しか行わない
s 文字列を単一行として扱う。(^と$が最初と最後にしかマッチしない)
x 拡張正規表現をつかう。(空白を無視するようになる。エスケープと[ ]以外)
g マッチしたものをすべて置換する

s演算子を使って、こんなこともOK。
perl -ne 'print if s/ABC/DEF/;' names.txt
ABCにマッチするかどうかのif文にしておいて、printさせるのはDEFに置換後という技。

パターン照合演算子

$hoge =~ /abc/ $hogeがabcを含むかどうかの条件式
$hoge !~ /abc/ $hogeがabcを含まないかどうかの条件式
$hoge =~ s/abc/def/ $hogeのabcをdefに置換

暗黙的にこれらは使っていた。
/abc/ が $_ ~= /abc/ と同じ意味だった。

tr, y

trとyは同じ。
置換文字列の文字を1つずつ置換する。
返り値は置換した文字数。
  • dオプション
    • 検索マッチングした文字は削除
  • cオプション
    • マッチングの意を逆に。マッチング条件にあてはまらないものを置換する。
  • sオプション
    • 同じ文字が繰り返されている場合にそれをマージする。
tr/a-z/A-Z/; print;
tr/ //d; print;
tr/0-9/*/c; print;
tr/:/:/s; print;