我有一个像这样的字符串:
Hello (0)
也可以有这个:
Hello 12345 (0) (1) (65)
我想做的是增加最后一个数字。在这种情况下,预期结果将是这样的:
Hello (1)
Hello 12345 (0) (1) (66)
有什么方法可以在Ruby或regex中神奇地做到这一点吗?如何在所有括号中保留所有数字,但增加最后一个?
请注意,字符串中可以包含unicode字母,因此结果不应被破坏。
答案 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)