[#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
[#48016] 文字列を正規表現にマッチする部分と他の部分に分割 — "5.5" <5.5@...>
5.5 です。
12 messages
2011/04/28
[ruby-list:48016] 文字列を正規表現にマッチする部分と他の部分に分割
From:
"5.5" <5.5@...>
Date:
2011-04-28 13:58:16 UTC
List:
ruby-list #48016
5.5 です。
文字列 S の中で,正規表現 R にマッチする部分とそれ以外の
部分をそれぞれ取得したいときに,どうもうまい方法が見つか
りません。
以下のような String#each_segment メソッドがあると嬉しい
です。(この例は非実用的です)
result=""
"ab12cd".each_segment /\d+/ do |str, match|
result << (match ? "<#{str}>" : str.upcase)
end
result # => "AB<12>CD"
ここで,二つめのブロックパラメーター match は MatchData
オブジェクトです。
str が非マッチ文字列のときは match は nil とします。
マッチ部分とそれ以外の部分を取り出すには,String#split
に括弧付きの正規表現を与える方法もありますが,
"ab12cd".split(/(\d+)/) # => ["ab", "12", "cd"]
正規表現中にグルーピングのための括弧があるとダメですし,
マッチ部分かそうでない部分かをもう一度判定しなければなり
ません。
そこで,strscan を使う方法を考えました。
s=StringScanner.new("ab12cd")
result=""
while offset=s.exist?(/\d+/)
len=offset-s.matched.size
result << s.peek(len).upcase unless len.zero?
result << "<#{s.matched}>"
s.pos=s.pos+offset
end
result << s.rest.upcase unless s.rest.empty?
これ以上簡潔な書き方が思いつきませんでした。
マッチ文字列の間を取り出す手段が無いからです。
いかにも回りくどいですし,非マッチ文字列に対する処理が
二箇所に書かれていて DRY ではありません。
また,pre_match,post_match を使うケースで,元テキストが
非常に大きく,マッチ箇所が多数ある場合には,大量の文字列
ゴミが生じると思います。
汎用性のあるもっとうまい書き方があるのか,それとも提案し
たようなメソッドの導入に意義があるのか,どんなものでしょ
うか。
--
5.5@moji.gr.jp