我有一些包含 JavaScript 变量定义的文本(页面的 HTML):
var FOREGROUND_COLOR = '#ffffff';
var BACKGROUND_COLOR = '#aaaaaa';
var BORDER_COLOR = '#000000';
我想使用 ruby 正则表达式模式匹配字符串内容/var BACKGROUND_COLOR = '(#.*?)';/
,并用替换值 ( #bbbbbb
) 替换捕获,然后返回整个原始模式并替换值,这样新的内容将是
var FOREGROUND_COLOR = '#ffffff';
var BACKGROUND_COLOR = '#bbbbbb';
var BORDER_COLOR = '#000000';
主要约束是模式是在外部文件中定义的,替换值来自数据库,并且内容(带有 javascript 和我想要更改的其他值的 HTML 页面)在运行时不受我的控制。所以当模式被定义时,我不知道替换,而当替换被定义时,我不知道模式。因此,我需要假设模式和价值都已给出。
简单的 ruby gsub 不起作用:
contents.gsub(pattern, replacement)
=>
var FOREGROUND_COLOR = '#ffffff';
#bbbbbb // this is the problem with simple gsub
var BORDER_COLOR = '#000000';
但看起来我可以使用反向引用(\1
)来使用块语法。但我宁愿不必更改我的模式,因为它们已经很复杂(这是一个简化的情况,正则表达式是处理模式变化所必需的)。我可以破解并使其工作,但这似乎并不明智。
如何在 Ruby 中有效地做到这一点?
附加说明(为什么尚未接受答案)我事先知道模式,但它并不总是以形式var SOMETHING = '#COLOR_VALUE';
——它可能是 CSS 规则、URL 或其他任意模式。如果我有一个值X, Y and Z
、一个模式/The letters of the day are (.*?), Cookie Monster/
和包含的内容
<p>Welcome to Sesame Street!</p>
<p>The letters of the day are Q, J and L, Cookie Monster. Do you like them?</p>
我的操作后内容应该是
<p>Welcome to Sesame Street!</p>
<p>The letters of the day are X, Y and Z, Cookie Monster. Do you like them?</p>
我不认为 7 月 11 日之前的答案提供了一个通用的解决方案,尽管他们可能会回答我提出的问题。谢谢你。