ste*_*och 0 regex ruby-on-rails gsub
我想从下面的代码中替换所有4个数字300的实例(我的网站用户将在创建新博客文章时粘贴它),使用470.
<div>
<object width="300" height="300">
<embed src="link-removed" width="300" height="300"></embed>
</object>
<p>
<a href="another-link">link</a>
</p>
</div>
Run Code Online (Sandbox Code Playgroud)
要粘贴的代码的宽度和高度可能不总是300乘300.
所以我想我可能需要一个正则表达式,它包含字符串"width ="和"height ="之后的任何数值,同时记住要考虑数字周围的引号.任何人都可以告诉我,这是最好的方式,如果是这样,最好的正则表达式是什么?
如果它很重要,被粘贴的代码将作为"文本"存储在数据库中而不是字符串中,因为它非常冗长(我已从您在此处粘贴的内容中删除了几百个字符)...
您可以找到(width|height)="\d+"并替换它$1="470".这会捕获组1 width或height组1,并在替换字符串中引用此捕获的字符串作为$1.
根据要求,模式可能变得更加复杂.如果你想对空白开放,你可以允许\s*周围的=; 例如,为了防止匹配,tablewidth="300"您可以在模式之前使用\b,等等.
该(...)构造是所谓的"捕获组".
鉴于此测试字符串:
i have 35 dogs, 16 cats and 10 elephants
Run Code Online (Sandbox Code Playgroud)
然后(\d+) (cats|dogs)得到2个匹配结果(参见rubular.com)
35 dogs
35dogs16 cats
16cats在替换字符串中,Ruby使用\而不是$作为sigil用于反向捕获组.
ruby-doc.org -
String#gsub:如果使用字符串作为替换,则匹配中的特殊变量(例如$&和$1)不能替换为它,因为在模式匹配开始之前会对字符串进行替换.然而,序列\1,\2等等,可以使用在比赛进行内插连续组.
因此,您正在寻找的解决方案是这样的:
text = 'blah blah width="300" and height="299" more blah'
puts text.gsub(/(width|height)="\d+"/, '\1="470"')
Run Code Online (Sandbox Code Playgroud)
打印(如ideone.com上所示):
blah blah width="470" and height="470" more blah
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
232 次 |
| 最近记录: |