【问题标题】:How do I search, increment, and replace integer substrings in a Ruby string?如何在 Ruby 字符串中搜索、递增和替换整数子字符串?
【发布时间】:2011-05-13 14:36:51
【问题描述】:

我有很多这样的文件:

foo_1 foo_2

foo_3

bar_1 foo_4 ...

我想通过获取foo_[X] 的所有实例并将它们中的每一个替换为foo_[X+1] 来转换它们。在这个例子中:

foo_2 foo_3

foo_4

bar_1 foo_5 ...

我可以用 gsub 和一个块来做到这一点吗?如果没有,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但觉得有一些正则表达式技巧值得学习。

【问题讨论】:

    标签: ruby regex string replace gsub


    【解决方案1】:

    我(完全不了解 Ruby),但类似的东西应该可以工作:

    "foo_1 foo_2".gsub(/(foo_)(\d+)/) {|not_needed| $1 + ($2.to_i + 1).to_s}
    

    LE:我确实做到了:http://codepad.org/Z5ThOvTr

    【讨论】:

    • 谢谢!我没有考虑匹配 (foo_) 并在块中重用它。
    • 你可以完全忽略|not_needed|
    • @Wayne 哦,好的。但是我会这样保留它以表明它可用但未使用。
    【解决方案2】:

    如果您只想更改 foo_ 后面的数字

    str.gsub(/(?<=foo_)\d+/) {|num| num.to_i+1}
    

    注意:look-behinds 仅适用于版本或 Ruby >= 1.9。

    【讨论】:

    • 实际上,如果您的 Ruby 版本 >= 1.9,lookbehinds 可以工作。 1.9 增加了一些有趣的新特性和一个很棒的正则表达式引擎,称为 Oniguruma(PHP5 mb regex 也使用它)。
    • @Phrogz。不幸的是,大多数人仍在使用 Ruby 1.8,它可以处理前瞻,但不能处理后瞻断言……
    • 我删除了我的评论,因为我显然没有足够的关于 Ruby 的信息来做出明智的评论。知道regular-expressions.info 是一个可靠的来源,我错误地认为它是最新的。另外,也许您应该在答案中添加注释以指定您的代码适用于哪个版本。
    • @Phrogz 作为记录,我正在从事的项目使用的是 ruby​​-1.8.7(不是我的选择)。这是一个企业部署,约有 25 名开发人员参与开发和维护的各个方面。虽然我确信小组中的所有开发人员都更喜欢 ruby​​-1.9,但短期内没有升级计划。
    【解决方案3】:

    更简单的就是使用 .next

    "foo_1".next #=> foo_2
    "bar_1 foo_1".next #=> bar_1 foo_2
    

    所以,你可以像这样简化你的正则表达式并阻止

    "bar_1 foo_2".gsub(/\bfoo_\d+\b/) {|f| f.next }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-03
      • 2015-04-11
      • 1970-01-01
      • 2015-05-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多