0

我在 ruby​​ 变量中有一个大文件,它遵循如下常见模式:

// ...

// comment
$myuser['bla'] = 'bla';

// comment
$myuser['bla2'] = 'bla2';

// ...

我试图给一个'键'替换'值'

这替换了整个字符串我该如何修复它?我认为的另一种方法是分两步完成,第一步是在引号内找到值然后执行字符串替换,什么是最好的?

def keyvalr(content, key, value)
    return content.gsub(/\$bla\[\'#{key}\'\]\s+\=\s+\'(.*)\'/) {|m| value }
end
4

2 回答 2

1

是贪婪的.*并且尽可能多地消耗(直到最后一个')。使那.a[^']那么它不可能超过第一个 close '

/(\$bla\[\'#{key}\'\]\s+\=\s+\')[^']*(\')/

我还添加了括号来捕获除要替换的值之外的所有内容。第一组括号将对应于\1,第二组将对应于\2。这样您就可以将其匹配替换为:

"\1yournewvaluehere\2"
于 2012-11-08T00:34:01.857 回答
0

我会使用类似的东西:

text = %q{
// ...

// comment
$myuser['bla'] = 'bla';

// comment
$myuser['bla2'] = 'bla2';

// ...
}

from_to = {
  'bla'  => 'foo',
  'bla2' => 'bar'
}

puts text.gsub(/\['([^']+)'\] = '([^']+)'/) { |t|
  key, val = t.scan(/'([^']+)'/).flatten
  "['%s'] = '%s'" % [ key, from_to[key] ]
}

哪个输出:

// ...

// comment
$myuser['bla'] = 'foo';

// comment
$myuser['bla2'] = 'bar';

// ...

这是它的工作原理:

如果我做:

puts text.gsub(/\['([^']+)'\] = '([^']+)'/) { |t|
  puts t
}

我懂了:

['bla'] = 'bla'
['bla2'] = 'bla2'

然后我尝试了:

"['bla'] = 'bla'".scan(/'([^']+)'/).flatten
=> ["bla", "bla"]

这给了我一个键,“值”对,所以我可以使用散列来查找替换值。

将它放在一个gsub块内意味着匹配的任何内容都被我的块返回值替换,所以我创建了一个字符串来替换“命中”并让它gsub做它的“thang”。

我不太相信使用长正则表达式。我不得不维护太多试图使用复杂模式的代码,并且出现了一些错误,并且未能在 100% 的时间内完成预期的任务。它们非常强大,但代码的维护比开发它更难/更糟糕,所以我尝试将我编写的模式保持在勺子大小的块中,对那些跟随我维护代码的人怜悯。

于 2012-11-08T01:10:42.417 回答