人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

perl初心者です。
文字列からアンダーバーに囲まれた2桁か3ケタの数字を取り出したいと思います。

$s = "_13_10_140_14_20_540_999_1_2_";
my @x = $s =~ /_([1-9][0-9][0-9]?)_/g;
print $_."\n" foreach (@x);

しかし、実行結果は
13
140
20
999
となり、失敗に終わりました。
なぜ、すべての2,3桁の数字を取り出してくれないのでしょうか・・・

また、正規表現の初心者が間違いやすいところをまとめたサイトを教えてください。

●質問者: spidermite
●カテゴリ:コンピュータ インターネット
✍キーワード:Perl print サイト 初心者 数字
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●40ポイント ベストアンサー
$s = "_13_10_140_14_20_540_999_1_2_";
my @x = $s =~ /_([1-9][0-9][0-9]?)(?=_)/g;
print $_."\n" foreach (@x);

perlre - Perl の正規表現

前方参照を使った例。


また、正規表現の初心者が間違いやすいところをまとめたサイトを教えてください。

初心者でなくても間違えるからなぁ。

いろいろ見て慣れるしかないと思うけど。

Perl正規表現雑技


2 ● dev_zer0
●40ポイント

下記URLにある

http://www.kent-web.com/perl/chap7.html

5. 量指定子

> 最大の範囲内で条件にあてはまる部分がマッチするという取り決めになっています。

とあるとおり

$sは

[_13_ ]残り文字列[10_140_14_20_540_999_1_2_]

[_140_]残り文字列[14_20_540_999_1_2_]

[_20_ ]残り文字列[540_999_1_2_]

[_999_]残り文字列[1_2_]

のように、「_(アンダーバー)」もマッチさせてしまいます


多分、期待している動作は

$s = "_13_10_140_14_20_540_999_1_2_";
my @x = $s =~ /_?([1-9][0-9][0-9]?)_/g;
print $_."\n" foreach (@x);

でしょう


3 ● otsune
●40ポイント
my @x = $s =~ /_([1-9][0-9][0-9]?)_/g;

my @x = $s =~ /(?<=_)([1-9]\d\d?)(?=_)/g;

と書き換えれば動作します。

正規表現についてのおススメは

http://www.kt.rim.or.jp/~kbk/regex/regex.html

ですね。

◎質問者からの返答

みなさん、ありがとうございました。たすかりました。

前方参照について調べてみることにします。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ