Project1

标题: 关于正规表达式向后引用的问题 [打印本页]

作者: SailCat    时间: 2017-12-23 12:20
标题: 关于正规表达式向后引用的问题
代码1的执行结果正常
RUBY 代码复制
  1. replace_pattern1 = /\\c(\d+)\[(.*?)\]/i
  2. replace_pattern2 = /\\d(\d+)\[(.*?)\]/i
  3. text.gsub!(replace_pattern1) {"\\c[#$1]#$2\\c[0]"}
  4. text.gsub!(replace_pattern2) {"\\c[#$1]\\d[#$2]\\c[0]"}

代码2的执行结果不正常
RUBY 代码复制
  1. replace_patterns = {
  2. /\\c(\d+)\[(.*?)\]/i => "\\c[#$1]#$2\\c[0]",
  3. /\\d(\d+)\[(.*?)\]/i => "\\c[#$1]\\d[#$2]\\c[0]"
  4. }
  5. replace_patterns.each {|k, v| text.gsub!(k) {v}}


是因为向后引用不能放在循环里吗?
作者: IamI    时间: 2017-12-23 20:58
字面值将于执行时被立即决定值。
当 replace_pattern 被结算时,其中的字符串内容被当即确定。
要延迟决定它的值,可以将它放在块(Proc)中。
比如:
  1. replace_patterns = {
  2.      /your_exp/ => Proc.new { |args| "value" }
  3. }
  4. replace_patterns.each {|k, v| text.gsub! k, &v }
复制代码

我有点不敢相信……
作者: taroxd    时间: 2017-12-23 21:07
除楼上的方法外,还可以用字符串作为 gsub 的第二个参数,用 \1 \2 指代被匹配的内容(具体的见文档),可以避开这个问题
作者: RyanBern    时间: 2017-12-23 21:21
本帖最后由 RyanBern 于 2017-12-23 21:23 编辑

1. 请选择正确的版块提问(x
2. 请善用搜索功能(x
https://rpg.blue/forum.php?mod=viewthread&tid=388535
作者: summer92    时间: 2017-12-23 23:25
俺基本看不懂啊,我只用基本的 loop end




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