[#47955] るびま記事募集:FiberとかSinatra/PadrinoとかBundlerとか — Makoto Kuwata <kwa@...>
桑田といいます。るびま編集部に入りました。
17 messages
2011/04/11
[#47956] Re: るびま記事募集:FiberとかSinatra/PadrinoとかBundlerとか
— Kiwamu Okabe <kiwamu@...>
2011/04/11
岡部と申します。いつもお世話になっております。
[#47971] Re: るびま記事募集:FiberとかSinatra/PadrinoとかBundlerとか
— Satoshi GUNJI <gunjisatoshi@...>
2011/04/14
郡司と申します。
[#47959] Ruby用のリアルタイムプロファイラ — Takahiro Sunaga <sunagae@...>
須永@ささだ研です。
5 messages
2011/04/11
[#47967] Re: CSV.read で読むとUTF-8の扱いがおかしい? — "Endo Akira" <endo4917@...>
遠藤と申します。
5 messages
2011/04/14
[#47990] String#gsub への委譲 — "5.5" <5.5@...>
5.5 です。
10 messages
2011/04/21
[#47991] Re: String#gsub への委譲
— "NARUSE, Yui" <naruse@...>
2011/04/21
2011年4月21日9:10 5.5 <5.5@moji.gr.jp>:
[#47997] lambda中のProc中のreturnの挙動について — m_takao <threewayhandshake@...>
高尾と申します。
6 messages
2011/04/22
[#48009] randの挙動 — YAGUCHI Yuya <yayugu@...>
矢口と申します
5 messages
2011/04/24
[ruby-list:48020] Re: 文字列を正規表現にマッチする部分と他の部分に分割
From:
"5.5" <5.5@...>
Date:
2011-04-30 03:58:17 UTC
List:
ruby-list #48020
信岡さん
5.5 です。アドバイスありがとうございます。
> これを用いれば、単純な while ループで望みの動作を得られます。
>
> result = ''
> str = 'ab12cd'
> while true do
> i = ( str =~ /\d+/ )
> result<< $`.upcase<< "<#{$&}>"
> str = $'
> end
> result<< str #=> "AB<12>CD"
これだとループの二回めで =~ が失敗し,$`.upcase で例外が発生しますが,
考え方は分かりました。ループのところは
while /\d+/=~str
result << $`.upcase<< "<#{$&}>"
str = $'
end
でいいのですね。
str を温存する方法ばかり考えていたので,思いつきませんでした。
大きなテキストで,かつマッチ箇所が多数あると,大量の文字列ゴミが出ま
すよね。
> ただ、5.5 さんの書かれた StringScanner での例と同じように
> 非マッチ文字列に対する処理が 2 箇所に書かれているという
> 問題があります。
> そこで、自分で新たに String#each_segment メソッドを定義する
> なら、以下のようになります。
そうですね,メソッドをつくっちゃえばいいわけですね。
>> マッチ部分とそれ以外の部分を取り出すには,String#split
>> に括弧付きの正規表現を与える方法もありますが,
>>
>> "ab12cd".split(/(\d+)/) # => ["ab", "12", "cd"]
>>
>> 正規表現中にグルーピングのための括弧があるとダメですし,
>> マッチ部分かそうでない部分かをもう一度判定しなければなり
>> ません。
>
> 正規表現中にグルーピングのための括弧があると、とのことですが、
> グルーピングにはグルーピングのための記法 ("(?:XXX)" の形式) が
> あるので、これを用いれば問題にはならないと思います。
そうなのですが,以下の理由で避けました。
[1] /(\d).\1/ のように正規表現中で後方参照を使いたい場合もある。
[2] あまり慣れていない人に使ってもらうツールを考えていたので,
エンドユーザーに (?: ) の使用を強いるのが憚られた。
[3] ブロック内でマッチデータを積極的に使いたい場合もある。
この,[2] の具体例ですが,正規表現学習者のために,ブラウザー上
でテキストと正規表現を入れると,マッチ文字列を色分け表示してく
れるツールを作っていました。
当初 split でやったら,正規表現に ( ) が入ったときに失敗したの
で,StringScanner で作り直しました。
> また、マッチ部分かそうでないかの判定は、結果の配列の偶数番目
> か奇数番目かで判断すればいいのではないでしょうか?
> 偶数番目はマッチ部分、奇数番目はそれ以外、です。
>
> irb(main):009:0> "1242faefa3423fae344".split( /(\d+)/, -1 )
> => ["", "1242", "faefa", "3423", "fae", "344", ""]
-1 を付けてやることで,必ず偶数番目がマッチ部分になるわけです
ね。なるほど,これは思いつきませんでした。
--
5.5@moji.gr.jp