Как увеличить последний номер внутри строки и скобок в Ruby (Rails) - PullRequest
0 голосов
/ 16 мая 2019

У меня есть такая строка:

Hello (0)

также может иметь это тоже:

Hello 12345 (0) (1) (65)

То, что я пытаюсь сделать, это увеличить последнее число.В этом случае ожидаемый результат будет таким:

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

Есть ли способ сделать это волшебным образом в Ruby или регулярном выражении?Как мне сохранить все числа во всех скобках, но увеличить последнюю?

Обратите внимание, что в строке могут быть буквы в кодировке Юникод, поэтому результат не должен быть разбит.

Ответы [ 4 ]

2 голосов
/ 16 мая 2019
str = "Hello 12345 (0) (1) (65) (33a)"

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

.* является жадным, поэтому он поглощает все символы, включая '(0)' и '(1)', до тех пор, пока не достигнет последнего совпадения \(\d+\).

1 голос
/ 16 мая 2019

Regex может сканировать различные части:

> 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})"

Очевидно, это не касается случаев ошибок и т. Д., Но дает вам начало

1 голос
/ 16 мая 2019

Вы можете использовать это регулярное выражение для достижения желаемого.

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

В ruby ​​вы можете использовать следующий код для изменения вашей строки

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

// => Hello 12345 (0) (1) (67)
1 голос
/ 16 мая 2019

Сначала найдите последнюю заключенную в скобки часть

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

Это находит пару круглых скобок с чем-то внутри, сопровождаемыми любыми не круглыми скобками до конца строки.

Далее,привязать это к переменной.

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

Наконец, построить выходную строку.

if /\A(?<prior>.*)\((?<lastnum>.*)\)[^\(\)]*\z/ =~ input_string
    "#{prior}(#{lastnum + 1})"
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...