perlの正規表現について教えてください

[上に] [前に] [次に]
カマイタチ 1999/08/06(金) 00:14:39
$str = "abcdefghijklmn"; のとき、"abcdefgh" を取り出す・・・具体的には、初めて出てきた "ijk" の直前までを取り出す方法を教えてください。

葉月 1999/08/06(金) 01:13:20
た〜んじゅんに、やっちゃうと
$str = "abcdefghijklmn";
$str =~ s/(^.*)(ijk.*)/$1/;
print $str;

# (^.*) : 行の最初から、改行以外のすべての文字にマッチ
# (ijk.*):ijkで始まり、その後ろは、改行以外のすべての文字にマッチ
# $1に(^.*)が代入され、$2に(ijk.*)が代入されるので、$strを$1に変換する

になるけど

葉月 1999/08/06(金) 01:22:03
いろいろと、つっこまれそうな書き方をしてしまった。。。
>変換
というより、置換でした。。。(他にも、ちょこちょこと...(--;;;)

ふじ 1999/08/06(金) 01:37:36
>$str =~ s/(^.*)(ijk.*)/$1/;
$str =~ s/(^.*?)(ijk.*)/$1/;
最小マッチにしないと、「最後に出て来たijk」の前の文字列、になりますね。

$str = "abcijkdefijklmn";
の場合に、 abc でなくて abcijkdef がひっかかる。

元の文字列を壊したくないなら
$str =~ /(^.*?)ijk/;
として $1 を参照するとか、
$str =~ /ijk/;
として $` を参照するとか。

[上に] [前に] [次に]