如何在Ruby(Rails)中增加字符串和括号内的最新数字

时间:2019-05-16 11:53:10

标签: ruby-on-rails ruby

我有一个像这样的字符串:

Hello (0)

也可以有这个:

Hello 12345 (0) (1) (65)

我想做的是增加最后一个数字。在这种情况下,预期结果将是这样的:

Hello (1)
Hello 12345 (0) (1) (66)

有什么方法可以在Ruby或regex中神奇地做到这一点吗?如何在所有括号中保留所有数字,但增加最后一个?

请注意,字符串中可以包含unicode字母,因此结果不应被破坏。

4 个答案:

答案 0 :(得分:2)

str = "Hello 12345 (0) (1) (65) (33a)"

str.sub(/.*\(\d+\)/, &:succ)
  #=> "Hello 12345 (0) (1) (66) (33a)"

.*很贪婪,因此吞噬了所有字符,包括'(0)''(1)',直到到达\(\d+\)的最后一个匹配项为止。

答案 1 :(得分:1)

首先找到最后一个带括号的部分

/\(.*\)[^\(\)]*\z/

这会找到一对括号,里面有一些东西,然后是任何非括号,直到字符串结尾。

下一步,将其绑定到变量。

/\((?<lastnum>.*)\)[^\(\)]*\z/ =~ input_string

最后构建输出字符串。

if /\A(?<prior>.*)\((?<lastnum>.*)\)[^\(\)]*\z/ =~ input_string
    "#{prior}(#{lastnum + 1})"
end

答案 2 :(得分:1)

正则表达式可以扫描不同部分:

> s = "Hello 12345 (0) (1) (65)"
> value = s.scan(/((.*)\((\d+)\)\z)/).first

这将匹配任何字符串,后跟“(”,后跟任意数字,后跟“)”,然后是字符串末尾。然后便有了一个可以操纵的数组。上方模式中的(未转义)括号将输入分组:

值是[“ Hello 12345(0)(1)(65)”,“ Hello 12345(0)(1)”,“ 65”]

这是将它们放在一起的情况

"#{value[1]}(#{value[2].to_i + 1})"

显然,这不处理错误情况,但可以帮助您开始

答案 3 :(得分:1)

您可以使用此正则表达式实现您想要的

\((\d+)\)(?!.*\(\d+\))

在ruby中,您可以使用以下代码更改字符串

"Hello 12345 (0) (1) (66)".str.sub(/\((\d+)\)(?!.*\(\d+\))/) { |s| s.succ }

// => Hello 12345 (0) (1) (67)