作者meld (mind)
看板Ruby
标题[问题] 正规表示式取代
时间Fri Mar 14 20:49:54 2014
请问各位,目前想使用 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/, '这里搞不定'
谢谢各位!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 1.169.179.15
1F:推 kusoayan:a.gsub(/\[(1;|)([3-4][0-9]|)m/, '\033 \1') 这样可吗? 03/14 23:18
2F:→ alog:/\[[\d\;]*m?/ 这样不就好惹 03/14 23:43
3F:→ meld:两位大大,尝试结果如下:首先是简化的算式在网站上确实找到 03/15 00:05
4F:→ meld:了所有的标的,但当我使用 b=match(算式) 的时候发现只能找到 03/15 00:06
5F:→ meld:第一个。然後将算式套入第一位大大的程式码後,跑出来的结果 03/15 00:07
6F:→ meld:033变到後方去了-> 03/15 00:09
7F:→ meld:# [1;37m33 推 [33m33 ID1[m33 [33m33 :Data1 [m33 03/15 00:09
8F:推 mars90226:一二楼的结果真的如你所说,想不懂为甚麽... 03/15 11:38
9F:→ mars90226:试试: b = a.gsub(/\[[\d\;]*m?/) {|m| "\033 #{m}" } 03/15 11:39
10F:推 mars90226:一楼的後面引号用单引号一定会错,要用双引号 03/15 11:43
11F:→ mars90226:只是我用双引号的结果好像还是不对 03/15 11:43
12F:→ mars90226:单引号字串的跳脱字元只支援 "\'" 和 "\\",不能用"\033 03/15 11:45
13F:→ meld:谢谢火星大大,小弟现在觉得说不定是正规表示法本身就怪怪的 03/15 13:24
14F:→ meld:例如如果将算法改为:b = a.match(/\[[\d\;]*m?/). 然後再使 03/15 13:24
15F:→ meld:用 p b 将目前b的内容(非字串)印出来,就会发现结果只有一组 03/15 13:25
16F:→ meld:#<MatchData "[1;37m"> 明明是有效的正规表示式,但找到的 03/15 13:26
17F:→ meld:元素居然只有一个,真的很诡异..... 03/15 13:26
18F:→ meld:最後如果这样搞,连在一起的话是可以的: 03/15 13:31
19F:→ meld:b = a.gsub(/\[[\d\;]*m?/) {|m| "\033#{m}" } 03/15 13:31
20F:→ meld:正规表示法真的是博大精深啊...... = =!还是谢谢各位朋友! 03/15 13:32
21F:推 mars90226:match只会比一次,就跟sub一样 03/15 14:41
22F:→ meld:谢谢火星大大! 03/17 20:29