正規表現メモ

いくつか正規表現で思っていたのと実際の挙動が違う所があったのでメモ

  • 複数行結合時の"\s"の挙動

正規表現でmフラグが付くと、"."の条件に改行コードがマッチされるが、"\s"はmフラグが無くとも改行コードにマッチする。

    • サンプルコード(bs_s_test.pl)
#!/usr/bin/perl

open(FILE,"bs_s_test.txt");


$str = "";

while(<FILE>){
    $str .= $_;
}


close(FILE);


if($str=~/(\S+)\s*(\S+)\s*\(/){

    print "$1 $2\n";
}
    • テキストファイル(bs_s_test.txt)
aa bb 
   cc ( .hoge (hoge2) );
    • 出力
bb cc
  • "^"の条件

一応分かっていたけど確認。行頭の文字という表現を"^\S"でマッチさせたい気持ちは分かるが、先頭に空白やスペースが入っていたらマッチしない。

    • サンプルコード(first_char.pl)
#!/usr/bin/perl
#空白やTabが付いていても行頭か? =>認識せず

open(FILE,"first_char.txt");

while(<FILE>){

    print "$1\n" if(/^(\S+)/);

}
    • テキストファイル(first_char.txt)
 aaa
    • 出力
 (何も出てこない)
  • 複数行結合時の"^"の挙動

正規表現でmフラグが付くと、例え行頭でなくとも"^"でトリガを掛けることが出来る。"$"も同様

    • サンプルコード(multi_line.pl)
#!/usr/bin/perl
#複数行の正規表現テスト

open(FILE,"multi_line.txt");
$line_str = "";
while(<FILE>){
    $line_str .= $_;
}
close(FILE);

#真ん中のbbbをキャプチャしたい

print "$1\n" if($line_str =~ /^(b\S+)/m);
    • テキストファイル(multi_line.txt)
aaa
bbb ccc 
ccc
    • 出力
bbb