Project1
标题: 正则表达式替换问题 [打印本页]
作者: RyanBern 时间: 2016-1-20 01:04
标题: 正则表达式替换问题
本帖最后由 RyanBern 于 2016-1-20 01:05 编辑
出于写对话框脚本的需要,现在遇到了一个正则表达式的替换问题。
现在需要利用正则表达式对一串字符串中的某些内容进行替换,就类似于宏展开那样。
例如,我想用'\red{文字}'来表示'\c[2]文字\c[0]',这样,在对话框中就可以方便做出临时更改文字颜色的效果,而且会少输入一些控制码。
如果是一个这样的还好说,直接利用
text.gsub!(/\\red\{(.*?)\}/) { "\\c[2]#{$1}\\c[0]" }
text.gsub!(/\\red\{(.*?)\}/) { "\\c[2]#{$1}\\c[0]" }
即可。
现在我有一堆这样的正则表达式命令,每个正则表达式内的群组化情况不相同。这些正则表达式和它们所对应的替换字符串以hash的形式储存。如果提前定义
GS = {
/\\red\{(.*?)\}/ => "\\c[2]#{$1}\\c[0]",
/\\col\[(\d+)\]\{(.*?)\}/ => "\\c[#{$1}]#{$2}\\c[0]"
}
GS = {
/\\red\{(.*?)\}/ => "\\c[2]#{$1}\\c[0]",
/\\col\[(\d+)\]\{(.*?)\}/ => "\\c[#{$1}]#{$2}\\c[0]"
}
会有问题,因为构造Hash表GS的时候,$1和$2的值为nil,所以Hash表里的内容不是我想要的。
请问如何写GS的构造(或者是更改下面代码细节上的书写方式),使得下面代码能得到预期的效果?
GS.each_pair do |regex, str|
text.gsub!(regex) { str }
end
GS.each_pair do |regex, str|
text.gsub!(regex) { str }
end
作者: taroxd 时间: 2016-1-20 08:00
本帖最后由 taroxd 于 2016-1-20 08:05 编辑
这里完全没有看出来使用 block 的必要呢……
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]'
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]'
另外,你这样写一个哈希表并没有比下面这些代码少打多少字。所以你完全可以直接一行一行写嘛。
text.gsub!(/xxx/, xxx)
text.gsub!(/yyy/, yyy)
text.gsub!(/xxx/, xxx)
text.gsub!(/yyy/, yyy)
作者: RyanBern 时间: 2016-1-20 08:56
taroxd 发表于 2016-1-20 08:00
这里完全没有看出来使用 block 的必要呢……
GS = {
原来后项引用可以用在这里,当初学的时候还真不知道有这个功能。
另外,这个Hash是在设置区域上,不是给我自己用。因为这个设定部分和真正调用部分相隔比较远,所以让使用者直接写的话会比较麻烦,还得来回找。(不过这个功能是给懂正则表达式的人用的,既然懂正则表达式那么直接写也没什么困难)
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |