查看: 2843|回复: 2

[讨论] 正则表达式替换问题

[复制链接]
梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

发表于 2016-1-20 01:04:40 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
本帖最后由 RyanBern 于 2016-1-20 01:05 编辑

出于写对话框脚本的需要,现在遇到了一个正则表达式的替换问题。

现在需要利用正则表达式对一串字符串中的某些内容进行替换,就类似于宏展开那样。
例如,我想用'\red{文字}'来表示'\c[2]文字\c[0]',这样,在对话框中就可以方便做出临时更改文字颜色的效果,而且会少输入一些控制码。
如果是一个这样的还好说,直接利用
[pre lang="Ruby"]text.gsub!(/\\red\{(.*?)\}/) { "\\c[2]#{$1}\\c[0]" }[/pre]
即可。
现在我有一堆这样的正则表达式命令,每个正则表达式内的群组化情况不相同。这些正则表达式和它们所对应的替换字符串以hash的形式储存。如果提前定义
[pre lang="Ruby"]GS = {
  /\\red\{(.*?)\}/ => "\\c[2]#{$1}\\c[0]",
  /\\col\[(\d+)\]\{(.*?)\}/ => "\\c[#{$1}]#{$2}\\c[0]"
}[/pre]
会有问题,因为构造Hash表GS的时候,$1和$2的值为nil,所以Hash表里的内容不是我想要的。

请问如何写GS的构造(或者是更改下面代码细节上的书写方式),使得下面代码能得到预期的效果?
[pre lang="Ruby"]GS.each_pair do |regex, str|
  text.gsub!(regex) { str }
end[/pre]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2016-1-20 08:00:39 | 显示全部楼层
本帖最后由 taroxd 于 2016-1-20 08:05 编辑

这里完全没有看出来使用 block 的必要呢……

[pre lang="ruby"]GS = {
  /\\red\{(.*?)\}/ => '\\c[2]\\1\\c[0]',
  /\\col\[(\d+)\]\{(.*?)\}/ => '\\c[\\1]\\2\\c[0]'
}

text = '\\red{VIPArcher}'

GS.each_pair do |regex, str|
  text.gsub!(regex, str)
end

text # => '\\c[2]VIPArcher\\c[0]'[/pre]

另外,你这样写一个哈希表并没有比下面这些代码少打多少字。所以你完全可以直接一行一行写嘛。

[pre lang="ruby"]text.gsub!(/xxx/, xxx)
text.gsub!(/yyy/, yyy)
[/pre]

评分

参与人数 1星屑 +200 收起 理由
RyanBern + 200 认可答案,另外你可以分类这里的帖子吧.

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9557
在线时间
5074 小时
注册时间
2013-6-21
回帖
3459

开拓者贵宾剧作品鉴家

 楼主| 发表于 2016-1-20 08:56:07 | 显示全部楼层
taroxd 发表于 2016-1-20 08:00
这里完全没有看出来使用 block 的必要呢……

GS = {


原来后项引用可以用在这里,当初学的时候还真不知道有这个功能。

另外,这个Hash是在设置区域上,不是给我自己用。因为这个设定部分和真正调用部分相隔比较远,所以让使用者直接写的话会比较麻烦,还得来回找。(不过这个功能是给懂正则表达式的人用的,既然懂正则表达式那么直接写也没什么困难)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部