Я пытался заменить строку «200 миллиардов долларов» десятичной «200,0 миллиардов долларов». Я использовал функцию замены строки gsub в рубине, которая заменит совпадающий символ из данной строки. В моем случае я пытался использовать совпавшую строку для замены существующей.

Я попробовал следующее.

“$200 billion”.sub(/\$(\d+) /, “\$#{$1}.0 ”)

Переменные $ 1, $ 2,… содержат совпадения для первой, второй и т. Д. Групп в скобках в последнем регулярном выражении.

Мой ожидаемый результат был $200.0 billion
Но фактический результат был: $.0 billion
Итак, я снова повторил его с той же командой в терминале, теперь я получил реальный результат «200,0 миллиардов долларов».

Теперь я узнал, что $ 1 - это глобальная переменная, впервые она имеет значение NULL. По этой причине я получил результат «0,0 миллиарда долларов». хотя $ 1 теперь присваивается совпавшей строке из-за совпадения регулярного выражения. Вот почему я получил результат на второй пробежке.

Вместо того, чтобы передавать подстановку в качестве параметра функции gsub, я изменил ее как блок, как показано ниже. Это работало так, как я хотел.

“$200 billion”.sub(/^\$(\d+)\s/) { |match| “$#{$1}.0 ” }

Получил ожидаемый результат: «200,0 млрд долларов». Есть и другие альтернативные решения этой проблемы.

"$200 billion".sub(/(?<int>\d+)/, '\k<int>.0 ') #using group name
"$200 billion".sub(/(?<int>\d+)/, '\0.0 ') #using group number

Действительно, двойные и одинарные кавычки будут иметь значение. Строки в двойных кавычках анализируются перед передачей аргумента.

Более подробную информацию можно найти в документации по адресу https://apidock.com/ruby/String/gsub.

Francium Tech - технологическая компания, специализирующаяся на поставке высококачественного масштабируемого программного обеспечения на экстремальных скоростях. Цифры и размер данных нас не пугают. Если у вас есть какие-либо требования или вы хотите бесплатно проверить работоспособность своих систем или архитектуры, напишите письмо по адресу [email protected], мы свяжемся с вами!