首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex替换最近出现的分组

Regex替换最近出现的分组
EN

Stack Overflow用户
提问于 2015-05-14 12:43:17
回答 2查看 628关注 0票数 1

在Ruby正则表达式中,我想使用gsub替换最后一个出现的分组,否则,在默认位置执行替换操作。我正在试图取代最后一次出现在40年代(40.49)的数字。我有以下正则表达式,它正确地捕获了我在'\3'中想要的分组

代码语言:javascript
复制
/(([1-3,5-9][0-9]|([4][0-9]))[a-z])*Foo/

我正在使用这个正则表达式的一些示例字符串是:

代码语言:javascript
复制
12a23b34c45d56eFoo
12a45b34c46d89eFoo
45aFoo
Foo
12a23bFoo
12a23b445cFoo

使用https://regex101.com/,我看到40年代的最后一个数字是在'\3'中捕获的。然后,我想以某种方式执行string.gsub(regex, '\3' => 'NEW')来替换最后一个事件,或者在Foo之前追加(如果不存在)。我想要的结果是:

代码语言:javascript
复制
12a23b34cNEWd56eFoo
12a45b34cNEWd89eFoo
NEWaFoo
NEWFoo
12a23bNEWFoo
12a23b4NEWcFoo
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-14 12:47:12

如果我正确理解的话,您对gsub with codeblock感兴趣

代码语言:javascript
复制
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事件时,您可能应该处理这一情况,例如:

代码语言:javascript
复制
gsub($~[1], "NEW$~[1]") if $~[3].nil?

要处理所有可能的情况,可以为Foo声明组

代码语言:javascript
复制
#                           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"

希望能帮上忙。

票数 1
EN

Stack Overflow用户

发布于 2015-05-14 14:04:37

我建议如下:

代码语言:javascript
复制
'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 
}

您需要找到相应的附加或替换方法,或者有人可以用简洁的代码进行编辑.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30237704

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档