[前][次][番号順一覧][スレッド一覧]

learn-ruby-in-kansai:89

From: Hiroshi Takagi <gollum@h...>
Date: Thu, 02 Dec 2004 18:39:41 +0900
Subject: [learn-ruby-in-kansai:89] Re: 3桁コンマ

高木@神戸です。


On Mon, 29 Nov 2004 00:08:44 +0900
"mbaba" <xml@t...> wrote:

> 3桁ずつコンマを振るというプログラムの正規表現で後ろからマッチングさせて
> いくというのは分かったのですが、(?=といった正規表現が最後までわかりません
> でした。(お恥ずかしい限り^^;)

こんな風に書いてみたら、理解の助けになりますかね?
gsub を使わないでsubで置換をloop 実行してみます。

int_s = "12345678901
while int_s.sub!(/(\d)(?=\d{3}+$)/, '\\1,') do
        printf("before     : \"%s\"\n", $`)
        printf("matched    : \"%s\"\n", $&)
        printf("after      : \"%s\"\n", $')
        printf("substituted: \"%s\"\n", int_s)
        puts
end

実行すると

before     : "1"
matched    : "2"
after      : "345678901"
substituted: "12,345678901"

before     : "12,34"
matched    : "5"
after      : "678901"
substituted: "12,345,678901"

before     : "12,345,67"
matched    : "8"
after      : "901"
substituted: "12,345,678,901"

最初にmatch しているのは、
"2"とその右となりの隙間(幅を持たないマッチ)になります。
(?=pattern)は、
先行先読み(lookahead assertion)と呼ばれるマッチングで
$ や^ のように幅を持ちません。
(?=\d{3}+$)で、\d{3}+ (三桁の数字の一回以上の繰り返し)が
$ で行末にアンカーされることで、
初回の置換が数字文字列の3桁区切りの最初に来るところがミソですねー。

こんなのも書いてみましたが、
ブロック内からint_s を参照することができないので
あんまりピンときませんなー。

int_s.gsub!( /(\d)(?=\d{3}+$)/){|matched|
        printf("before     : \"%s\"\n", $`)
        printf("matched    : \"%s\"\n", matched)
        printf("after      : \"%s\"\n", $')
        puts

        matched + ","
}


> で、以下のサイトで、perlなんでしかもreverseを使うやりかたなんですが、いろい
> ろ
> 説明がありましたので、なにかの役に立てばと。
> 
> http://allabout.co.jp/career/cgiperl/closeup/CU20040623A/

sub put_comma {
  my $num = $_[0];
  $num = reverse $num;
  $num =~ s/(\d{3})(?=\d)(?!\d*\.)/$1,/g;
  $num = reverse $num;
  return $num
}


このやり方がいちばん直感的にピンとこないですねー、わたしには。

sub put_comma {
  my $num = $_[0];
  $num = reverse $num;
  $num =~ s/(\d{3})(?=\d)(?!\d*\.)/$1,/g;
  $num = reverse $num;
  return $num
}

隙間の連続使いで頭のパイプラインが一瞬stall します :-(

-- 
Hiroshi Takagi <gollum@h...>



--
ML: learn-ruby-in-kansai@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

        81 2004-11-27 17:29 [babie7a0@y...       ] お疲れさま、サマリー作りましょう        
        82 2004-11-28 14:33 ┗[xml@t...            ]                                       
        83 2004-11-28 15:53  ┣[xml@t...            ] テキストの整形                      
        84 2004-11-28 16:08  ┃┣[xml@t...            ] 3桁コンマ                        
->      89 2004-12-02 10:39  ┃┃┗[gollum@h...         ]                                 
        90 2004-12-03 13:10  ┃┃ ┗[xml@t...            ]                               
        96 2004-12-03 17:22  ┃┗[babie7a0@y...       ]                                   
        98 2004-12-03 18:32  ┃ ┣[nov@y...            ]                                 
        99 2004-12-03 23:46  ┃ ┗[konami@k...         ]                                 
        85 2004-11-29 03:25  ┗[sakai-n@m...        ]