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桁の数字を取り出してくれないのでしょうか・・・

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

回答の条件
  • URL必須
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/11 12:56:04
  • 終了:2010/03/11 13:29:24

ベストアンサー

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402010/03/11 13:07:55

ポイント40pt
$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件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402010/03/11 13:07:55ここでベストアンサー

ポイント40pt
$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正規表現雑技

id:dev_zer0 No.2

dev_zer0回答回数332ベストアンサー獲得回数252010/03/11 13:24:19

ポイント40pt

下記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);

でしょう

id:otsune No.3

otsune回答回数35ベストアンサー獲得回数52010/03/11 13:25:22

ポイント40pt
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

ですね。

id:spidermite

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

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

2010/03/11 13:28:45
  • id:taknt
    >アンダーバーに囲まれた2桁か3ケタの数字

    アンダーバーは不要

    アンダーバーに囲まれていれば その間に 何があってもOK

    _ 23 _

    となると うまくできない場合がある。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません