【问题标题】:Partial string replace with gsub部分字符串替换为 gsub
【发布时间】:2013-08-15 08:40:21
【问题描述】:

我有一组不同的图像 url,我需要将“/s_”替换为“/xl_”。我尝试了许多不同的方法,但它们似乎都没有像我期望的那样工作。这是我的最新版本:

available_images.each do |img|
    img.gsub(/.*(\/s_).*\.jpg/, "\/xl_")
end

available_images 是包含多个字符串的数组(当然匹配提供的正则表达式: .*(/s_).*.jpg )。 关于如何解决这个问题有什么想法吗?

提前致谢!

【问题讨论】:

    标签: ruby replace gsub


    【解决方案1】:

    带有简单字符串(而不是正则表达式)的gsub!!,因为您使用的是each 而不是map)应该可以工作:

    "path/to/s_image.jpg".gsub '/s_', '/xl_'
    # => "path/to/xl_image.jpg"
    

    更新

    正如 cmets 中所指出的,如果路径包含多次出现的 '/s_',则该解决方案可能会导致意外行为。

    "path/s_thing/s_image.jpg".gsub '/s_', '/xl_'
    #=> "path/xl_thing/xl_image.jpg"
              ▲        ▲
    

    Borodin 发布了一个不错的简短正则表达式替换,适用于这种情况:

    "path/s_thing/s_image.jpg".sub %r|/s_(?!.*/)|, '/xl_'
    #=> "path/s_thing/xl_image.jpg"
              △        ▲
    

    它只替换最后一次出现的'/s_'

    【讨论】:

    • 感谢您的提示。工作正常!
    • 可能sub更合适
    • sub 可能与gsub 一样错误。在字符串 '/s_' 多次出现的情况下,两者都可能导致意外的行为。也许sub! /(.*)(?:\/s_)(.*\.jpg)/, "#{$1}/xl_#{$2}" 更好(但更复杂)
    • sub %r|/s_(?!.*/)|, '/xl_'
    猜你喜欢
    • 1970-01-01
    • 2010-09-12
    • 1970-01-01
    • 2019-07-22
    • 2013-09-05
    • 2021-10-30
    • 2012-07-17
    • 2023-02-22
    相关资源
    最近更新 更多