Ruby 正则表达式替换最后一次出现的分组
Ruby Regex Replace Last Occurence of Grouping
在 Ruby 正则表达式中,我想使用 gsub 替换最后一次出现的分组,如果它出现,否则,无论如何在默认位置执行替换。我正在尝试替换 40 年代最后一次出现的数字 (40...49)。我有以下正则表达式,它正确地捕获了我想要的分组 ''
:
/(([1-3,5-9][0-9]|([4][0-9]))[a-z])*Foo/
我正在使用此正则表达式的一些示例字符串是:
12a23b34c45d56eFoo
12a45b34c46d89eFoo
45aFoo
Foo
12a23bFoo
12a23b445cFoo
使用 https://regex101.com/,我看到 40 秒中的最后一个数字在 ''
中被捕获。然后我想以某种方式执行 string.gsub(regex, '' => 'NEW')
来替换最后一次出现或在 Foo 之前追加(如果不存在)。我想要的结果是:
12a23b34cNEWd56eFoo
12a45b34cNEWd89eFoo
NEWaFoo
NEWFoo
12a23bNEWFoo
12a23b4NEWcFoo
如果我没理解错的话,您对 gsub
和 codeblock
感兴趣:
str.gsub(PATTERN) { |mtch|
puts mtch # the whole match
puts $~[3] # the third group
mtch.gsub($~[3], 'NEW') # the result
}
'abc'.gsub(/(b)(c)/) { |m| m.gsub($~[2], 'd') }
#⇒ "abd"
也许你应该处理根本没有 40
-s 发生的情况,比如:
gsub($~[1], "NEW$~[1]") if $~[3].nil?
为了处理所有可能的情况,可以为 Foo
声明组:
# NOTE THE GROUP ⇓⇓⇓⇓⇓
▶ re = /(([1-3,5-9][0-9]|([4][0-9]))[a-z])*(Foo)/
#⇒ /(([1-3,5-9][0-9]|([4][0-9]))[a-z])*(Foo)/
▶ inp.gsub(re) do |mtch|
▷ $~[3].nil? ? mtch.gsub($~[4], "NEW#{$~[4]}") : mtch.gsub(/#{$~[3]}/, 'NEW')
▷ end
#⇒ "12a23b34cNEWd56eFoo\n12a45b34cNEWd89eFoo\nNEWaFoo\nNEWFoo\n12a23bNEWFoo"
希望对您有所帮助。
我建议如下:
'12a23b34c45d56eFoo'.gsub(/(([1-3,5-9][0-9]|([4][0-9]))[a-z])*Foo/) {
if Regexp.last_match[3].nil? then
puts "Append before Foo"
else
puts "Replace group 3"
end
}
您需要找到一种方法来相应地附加或替换,或者也许有人可以使用简洁的代码进行编辑...
在 Ruby 正则表达式中,我想使用 gsub 替换最后一次出现的分组,如果它出现,否则,无论如何在默认位置执行替换。我正在尝试替换 40 年代最后一次出现的数字 (40...49)。我有以下正则表达式,它正确地捕获了我想要的分组 ''
:
/(([1-3,5-9][0-9]|([4][0-9]))[a-z])*Foo/
我正在使用此正则表达式的一些示例字符串是:
12a23b34c45d56eFoo
12a45b34c46d89eFoo
45aFoo
Foo
12a23bFoo
12a23b445cFoo
使用 https://regex101.com/,我看到 40 秒中的最后一个数字在 ''
中被捕获。然后我想以某种方式执行 string.gsub(regex, '' => 'NEW')
来替换最后一次出现或在 Foo 之前追加(如果不存在)。我想要的结果是:
12a23b34cNEWd56eFoo
12a45b34cNEWd89eFoo
NEWaFoo
NEWFoo
12a23bNEWFoo
12a23b4NEWcFoo
如果我没理解错的话,您对 gsub
和 codeblock
感兴趣:
str.gsub(PATTERN) { |mtch|
puts mtch # the whole match
puts $~[3] # the third group
mtch.gsub($~[3], 'NEW') # the result
}
'abc'.gsub(/(b)(c)/) { |m| m.gsub($~[2], 'd') }
#⇒ "abd"
也许你应该处理根本没有 40
-s 发生的情况,比如:
gsub($~[1], "NEW$~[1]") if $~[3].nil?
为了处理所有可能的情况,可以为 Foo
声明组:
# NOTE THE GROUP ⇓⇓⇓⇓⇓
▶ re = /(([1-3,5-9][0-9]|([4][0-9]))[a-z])*(Foo)/
#⇒ /(([1-3,5-9][0-9]|([4][0-9]))[a-z])*(Foo)/
▶ inp.gsub(re) do |mtch|
▷ $~[3].nil? ? mtch.gsub($~[4], "NEW#{$~[4]}") : mtch.gsub(/#{$~[3]}/, 'NEW')
▷ end
#⇒ "12a23b34cNEWd56eFoo\n12a45b34cNEWd89eFoo\nNEWaFoo\nNEWFoo\n12a23bNEWFoo"
希望对您有所帮助。
我建议如下:
'12a23b34c45d56eFoo'.gsub(/(([1-3,5-9][0-9]|([4][0-9]))[a-z])*Foo/) {
if Regexp.last_match[3].nil? then
puts "Append before Foo"
else
puts "Replace group 3"
end
}
您需要找到一种方法来相应地附加或替换,或者也许有人可以使用简洁的代码进行编辑...