用于从某些文本中删除某些变量数值的正则表达式

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 ="之后的任何数值,同时记住要考虑数字周围的引号.任何人都可以告诉我,这是最好的方式,如果是这样,最好的正则表达式是什么?

如果它很重要,被粘贴的代码将作为"文本"存储在数据库中而不是字符串中,因为它非常冗长(我已从您在此处粘贴的内容中删除了几百个字符)...

pol*_*nts 5

您可以找到(width|height)="\d+"并替换它$1="470".这会捕获组1 widthheight组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)

  • 结果1: 35 dogs
    • 第1组捕获 35
    • 第2组捕获 dogs
  • 结果2: 16 cats
    • 第1组捕获 16
    • 第2组捕获 cats

参考


在Ruby中

在替换字符串中,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)