Моя строка в Ruby содержит валюту и сумму.

Я приобрел товар по цене 500,80 долларов США в интернет-магазине 123X87.

Жду следующего результата

Я приобрел товар по цене 500,80 долларов США в интернет-магазине 123X87.

Я пробовал с Regex, но безуспешно.

str = "I have purchased and item at USD500.80 from online store store 123X87"

str.gsub(/\d+/, ' \0 ')

# wrong result

"I have purchased and item at USD 500 . 80  from online store store  123 X 87 "

Я не уверен, какую валюту содержит эта строка. Я знаю только валюту, а в сумме нет места.

str = "I have purchased and item at EUR500.80 from online store store 123X88"

str = "I have purchased and item at GBP500.80 from online store store 123X88"
1
siv rj 23 Ноя 2021 в 12:56
1
Может быть достаточно написать str.gsub(/(?<=[A-Z]{3})(?=\d+\.\d{2}\b)/, ' '). Это совпадение нулевой ширины, которому предшествуют три заглавные буквы, за которым следуют одна или несколько цифр, точка и затем еще две цифры. (?<=[A-Z]{3}) - это положительный взгляд назад , а (?=\d+\.\d{2}\b) - это положительный взгляд вперед . Возможно необходимы некоторые настройки. Например, некоторые суммы могут содержать запятые или не содержать точки. Возможно, будет достаточно /(?<=[A-Z])(?=\d)/ (то есть вставить пробел после заглавной буквы, за которой сразу следует цифра).
 – 
Cary Swoveland
23 Ноя 2021 в 13:59
Полезное решение. Спасибо.
 – 
siv rj
23 Ноя 2021 в 14:02

1 ответ

Лучший ответ

Я бы изменил регулярное выражение для явного сканирования всех известных кодов валют. Любое чрезмерно обобщенное регулярное выражение (например, \w+\d+) обязательно нарушит другие части строки, например порядковые номера.

str = "I have purchased and item at USD500.80 from online store store 123X87"
str.gsub(/(USD|EUR)(\d+)/, '\1 \2')
# => "I have purchased and item at USD 500.80 from online store store 123X87"
2
Sergio Tulentsev 23 Ноя 2021 в 13:42
Обновил свой вопрос. Если я использую 100 единиц валюты, и если я не знаю, какая валюта была использована внутри строки, что вы посоветуете?
 – 
siv rj
23 Ноя 2021 в 13:40
1
Мое предложение будет таким же. Это все еще ограниченный список.
 – 
Sergio Tulentsev
23 Ноя 2021 в 13:41