Я пытался заменить строку «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], мы свяжемся с вами!