[问题] 正规表示式取代

楼主: 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