[問題] 正規表示式取代

作者: meld (mind)   2014-03-14 20:49:54
請問各位,目前想使用 Ruby 解決一個問題:
從 bbs 轉寄回信箱的文章,其內文會把一些上色的文字,
直接使用控制碼表示出來,例如推文會變成這樣:
# [1;37m推 [33mID1[m[33m:Data1 [m 03/14 02:40
目前的想法是使用 regx 在這些控制碼之前都加上\033,
然後就可以使用 puts 印出原本上色後的文字。
目前在這個網頁測試了我使用的正規表示法,
從網頁裡的結果看起來這個正規表示式是有效的:
http://rubular.com
我使用的正規表示式是:
\[(1;|1|)([3-4][0-9]|)m
好,現在的問題在於使用 gsub 方法後結果不如預期,
所以想請教一下 gsub 的取代方式。
a = "# [1;37m推 [33mID1[m[33m:Data1 [m 03/14 02:40"
b = a.gsub /\[(1;|)([3-4][0-9]|)m/, '這裡搞不定'
謝謝各位!
作者: kusoayan (Bert)   2014-03-14 23:18:00
a.gsub(/\[(1;|)([3-4][0-9]|)m/, '\033 \1') 這樣可嗎?
作者: alog (A肉哥)   2014-03-14 23:43:00
/\[[\d\;]*m?/ 這樣不就好惹
作者: meld (mind)   2014-03-15 00:05:00
兩位大大,嘗試結果如下:首先是簡化的算式在網站上確實找到了所有的標的,但當我使用 b=match(算式) 的時候發現只能找到第一個。然後將算式套入第一位大大的程式碼後,跑出來的結果033變到後方去了-># [1;37m33 推 [33m33 ID1[m33 [33m33 :Data1 [m33
作者: mars90226 (火星人)   2014-03-15 11:38:00
一二樓的結果真的如你所說,想不懂為甚麼...試試: b = a.gsub(/\[[\d\;]*m?/) {|m| "\033 #{m}" }一樓的後面引號用單引號一定會錯,要用雙引號只是我用雙引號的結果好像還是不對單引號字串的跳脫字元只支援 "\'" 和 "\\",不能用"\033
作者: meld (mind)   2014-03-15 13:24:00
謝謝火星大大,小弟現在覺得說不定是正規表示法本身就怪怪的例如如果將算法改為:b = a.match(/\[[\d\;]*m?/). 然後再使用 p b 將目前b的內容(非字串)印出來,就會發現結果只有一組#<MatchData "[1;37m"> 明明是有效的正規表示式,但找到的元素居然只有一個,真的很詭異.....最後如果這樣搞,連在一起的話是可以的:b = a.gsub(/\[[\d\;]*m?/) {|m| "\033#{m}" }正規表示法真的是博大精深啊...... = =!還是謝謝各位朋友!
作者: mars90226 (火星人)   2014-03-15 14:41:00
match只會比一次,就跟sub一樣
作者: meld (mind)   2014-03-17 20:29:00
謝謝火星大大!

Links booklink

Contact Us: admin [ a t ] ucptt.com