Project1

标题: gsub!怎么匹配负数 [打印本页]

作者: Hello``Bubble    时间: 2021-2-7 13:23
标题: gsub!怎么匹配负数
我想用代码做一个改变画面色调的脚本
大概就是通过在地图名称中加入 <r:***>  <g:***> <b:***>
在Game_Map刷新的时候能直接应用到地图中。而不需要通过事件改变画面色调。
这个样子大概已经可以实现了。。
但是map_name.gsub!(/<r:([0-9]+)>/) { "" } 居然不能够匹配负数!!!!!
搞成两行又特别不舒服,所以要怎么做呢??

RUBY 代码复制
  1. def map_name
  2.     return if @mapinfo[@map_id].nil?
  3.     name = @mapinfo[@map_id].name
  4.     name.gsub!(/<r:([0-9]+)>/) { "" }
  5.     name.gsub!(/<g:([0-9]+)>/) { "" }
  6.     name.gsub!(/<b:([0-9]+)>/) { "" }
  7.     name.gsub!(/<gray:([0-9]+)>/) { "" }
  8.     return name
  9.   end
  10.   alias setup_rgss1 setup
  11.   def setup(map_id)
  12.     @mapinfo = load_data("Data/MapInfos.rxdata") if @mapinfo.nil?#兼容旧存档防错
  13.     if @mapinfo[map_id]
  14.       map_name = @mapinfo[map_id].name
  15.       map_name.gsub!(/<r:(-[0-9]+)>/) { "" }
  16.       red = $1.nil? ? 0 : $1.to_i
  17.       map_name.gsub!(/<r:([0-9]+)>/) { "" }
  18.       red = $1.nil? ? 0 : $1.to_i if red == 0
  19.       map_name.gsub!(/<g:(-[0-9]+)>/) { "" }
  20.       green = $1.nil? ? 0 : $1.to_i
  21.       map_name.gsub!(/<g:([0-9]+)>/) { "" }
  22.       green = $1.nil? ? 0 : $1.to_i if green == 0
  23.       map_name.gsub!(/<b:(-[0-9]+)>/) { "" }
  24.       blue = $1.nil? ? 0 : $1.to_i
  25.       map_name.gsub!(/<b:([0-9]+)>/) { "" }
  26.       blue = $1.nil? ? 0 : $1.to_i if blue == 0
  27.       map_name.gsub!(/<gray:(-[0-9]+)>/) { "" }
  28.       gray = $1.nil? ? 0 : $1.to_i
  29.       map_name.gsub!(/<gray:([0-9]+)>/) { "" }
  30.       gray = $1.nil? ? 0 : $1.to_i if gray == 0
  31.       if red.abs + green.abs + blue.abs + gray.abs != 0
  32.         tone = Tone.new(red,green,blue,gray)
  33.         $game_screen.start_tone_change(tone, 0)
  34.       end
  35.     end
  36.     setup_rgss1(map_id)
  37.   end

作者: enghao_lim    时间: 2021-2-7 14:02
  1. (-*[0-9]+)
复制代码

作者: MCCF    时间: 2021-2-7 14:13
仅供参考,来源:https://c.runoob.com/front-end/854

作者: fux2    时间: 2021-2-7 15:40
  1. "-50"[/(\-?\d+)/]
复制代码

一般情况下也不需要太复杂
作者: KB.Driver    时间: 2021-2-7 21:05
本帖最后由 KB.Driver 于 2021-2-7 21:07 编辑

正则的规则其实很简单……掌握基本规则就能搞定一些简单的判断。
不过正式应用场合因为需要测试的缘故,直接找现成稳定的代码也是一种选择。

从已有的部分来看,楼主已经有了正则的基础,接下来就是经验的问题了。

工程实践方面,不推荐对原数据做破坏性修改。
也就是说,不要修改@name变量,但是你可以对name方法复制一份并进行修改,例如不读取井号以后的部分
RUBY 代码复制
  1. alias ordinary_name name
  2. def name
  3.   @processed_name ||= ((n = ordinary_name.index("#")) ? ordinary_name[0, n] : ordinary_name)
  4. end


然后,既然一次要读3个数,可以压缩数据,提高数据浓度。
例如使用<tone:xx,xx,xx,xx>,当然最后一个数可以省略

这个可以这样读
RUBY 代码复制
  1. map_name = @mapinfo[map_id].ordinary_name
  2. if map_name =~ /<tone:(-?\d+),(-?\d+),(-?\d+),?(-?\d+)?>/i
  3.   r, g, b, a = Regexp.last_match.captures # a指代ash,勉强也算“灰”
  4.   a ||= 0 # 灰度默认为0
  5.   # 色调操作
  6. end


测试





欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1