Ruby on rails ruby中的复合正则表达式

Ruby on rails ruby中的复合正则表达式,ruby-on-rails,ruby,regex,Ruby On Rails,Ruby,Regex,我要用ruby制作一个复杂的正则表达式 str = '1:2-2:1015-3:1007,=,0-4:2,|,3' regex = /(\d+):|(\d+),\|,(\d+)/ 我的目标是只查找某些数字(例如“:”之前的数字),并为所有数字添加一个数字 示例:如果我想将20个元素添加到所有元素中,我的str将如下所示: str = '21:2-22:1015-23:1007,=,0-24:22,|,23' str.gsub(/(\d+):/){|m| m.to_i + 30} Result

我要用ruby制作一个复杂的正则表达式

str = '1:2-2:1015-3:1007,=,0-4:2,|,3'
regex = /(\d+):|(\d+),\|,(\d+)/
我的目标是只查找某些数字(例如“:”之前的数字),并为所有数字添加一个数字

示例:如果我想将20个元素添加到所有元素中,我的str将如下所示:

str = '21:2-22:1015-23:1007,=,0-24:22,|,23'
str.gsub(/(\d+):/){|m| m.to_i + 30}
Result : "312-321015-331007,=,0-3432" 
我可以用这个正则表达式找到它们,但我找不到如何进行加法

我试过一些类似的方法:

str = '21:2-22:1015-23:1007,=,0-24:22,|,23'
str.gsub(/(\d+):/){|m| m.to_i + 30}
Result : "312-321015-331007,=,0-3432" 
它删除了“:”和“|”,并且没有对最后一个数字进行加法

我肯定我做错了。也许用地图和扫描我能做些正确的事情

谢谢你的帮助,我希望我的解释清楚


编辑:下面的两个解决方案对我来说都是正确的,请毫不犹豫地阅读它们

您的上一个正则表达式与原始模式中的
(\d+)、\\124;、(\ d+)
模式不匹配。请注意,由于您已经匹配了
,|,
,因此需要在替换中重新插入它们。此外,更重要的是,您只需要对捕获的值应用加法,而不需要对整个匹配的文本应用加法

使用类似

str = '1:2-2:1015-3:1007,=,0-4:2,|,3'
regex = /(\d+):|(\d+),\|,(\d+)/
toadd  = 20
puts str.gsub(regex) { $~[2] ? "#{$~[2].to_i + toadd},|,#{$~[3].to_i + toadd}" : "#{$~[1].to_i + toadd}:" }


您需要首先检查组2(
$~[2]
)是否匹配,如果匹配,则只对组2和3执行添加,如果不匹配,则只添加到组1(
$~[1]
)内容。

有一种更简单的方法:

▶ str = '1:2-2:1015-3:1007,=,0-4:2,|,3'
▶ regex = /\d+(?=:)|\d+(?=,\|,\d)|(?<=\d,\|,)\d+/
▶ str.gsub(regex) { |m| (m.to_i + 20).to_s }
#⇒ "21:2-22:1015-23:1007,=,0-24:22,|,23"
▶ str='1:2-2:1015-3:1007,=,0-4:2,|,3'

▶ regex=/\d+(?=:)\d+(?=,\\\\,\d)|(?这太完美了,我想我需要练习更多的regex。非常感谢。积极的外观头提供了使用gsub的块版本来执行请求的操作的能力。我正在尝试了解这是如何工作的,也许以后我需要添加一个其他选项,如(\d+),\&(\d+)。对于您的解决方案,我需要创建一个其他内部条件(不知道这是一个正确的句子对不起)?不,您需要在模式中创建一个替换或字符类。在这里,我将使用字符类
[|和]
/(\d+):|(\d+),[|和],(\d+)/
。关键是你不能总是依赖lookbehind,因为它在Ruby regex中不可能是无限宽的。Lookarounds在性能方面也更昂贵。没有想到这一点,我喜欢你的方式,但它对我的使用更复杂,但我还是学到了一些非常有用的东西:D再次感谢!如果你使用的是零宽度断言,您不需要捕获组。您可以只使用
/\d+(?=:)\d+(?=,\\124;,\ d)(?请告诉我什么是零宽度断言?这些是锚(
^
\a
$
\z
)字边界(
\b
\b
)以及类似的
(?!\d)
(向前看)和
(?@WiktorStribiżew的确,谢谢,这是一个复制粘贴的问题。请不要忘记接受最适合您的解决方案。请注意,您可以投票选择任何您认为有用的解决方案。我不会忘记,我现在正在尝试,两种解决方案对我来说都可以:)