Ruby 轨道3和x2B;正则表达式-替换字符串的一部分,出现1次

Ruby 轨道3和x2B;正则表达式-替换字符串的一部分,出现1次,ruby,regex,ruby-on-rails-3,Ruby,Regex,Ruby On Rails 3,我不熟悉Rails,更不熟悉regex。一直在四处寻找,但我被封锁了 我有这样一个字符串: 当前:http://zs.domain.com/user_images/123456789/imageName_size.ext 通缉:http://zs.domain.com/user_images/123456789/imageName.ext 我终于做到了: =>正在丢失与的所有事件 picture.gsub!(/_([a-z0-9-]+)/, '') 或者这个: =>仅更改最后一次出现,但丢

我不熟悉Rails,更不熟悉regex。一直在四处寻找,但我被封锁了

我有这样一个字符串:

当前:
http://zs.domain.com/user_images/123456789/imageName_size.ext

通缉:
http://zs.domain.com/user_images/123456789/imageName.ext

我终于做到了:

=>正在丢失与的所有事件

picture.gsub!(/_([a-z0-9-]+)/, '')
或者这个:


=>仅更改最后一次出现,但丢失扩展名

picture.gsub!(/_([a-z0-9-]+)**.(png|gif|jpg|jpeg)**/, '')  

你快到了。第二个参数是替换匹配的字符串,您可以从匹配中重用匹配的组。这将实现以下目的:

picture.gsub!(/_([a-z0-9-]+).(png|gif|jpg|jpeg)/, '.\2')
为了适应评论中提出的附加条件:

picture.gsub!(/_([^\/]+).(png|gif|jpg|jpeg)/, '.\2')

markijbema的答案将改变字符串

../xxx\u yyyygifzzz/…

进入

../xxxgifzzz/…

为了避免这种情况,您可以执行以下操作:

picture.gsub!(/_[^\/]+(?=\.[^\.]+\z)/, '')
  • (?=…)
    被理解为字符串后面的上下文,不会包含在匹配中
  • \z
    描述了字符串的结尾,因此当某些中间目录包含上述字符串时,可以安全地使用此regexp

非常感谢!正则表达式对于初学者黑客来说很棘手;)然而,还有另一个我没有意识到的选择——我试图注册的图片是twitter个人资料图片。图像名称的_size部分(即ImgName_size.ext)可以是_小、_正常或_小。在最后一个例子中,它只替换了_小部分……这个怎么样(见更新的答案)。另外,尽量不要把正则表达式看作是魔术。当你有时间的时候,读一篇关于有限状态自动机的文章,这会让你更清楚它是如何工作的。@mark:谢谢,开始理解:)尽管第二个解决方案给了我一个语法错误
/home/laurent/Dev/blog/app/views/users/show.html.erb:10:char类过早结束:/(home/laurent/Dev/blog/app/views/users/show.html.erb:10:syntax error,意外的']',预期的'')…=(@user.picture.gsub(/([^/]+)(png | gif | jpg | jpeg)/,“\2”)…^
哦,对不起,您需要一个\作为/(答案中已修复)此regexp有一些问题。请参阅我的答案。