Я бы сделал что-то вроде этого:
foo = "starta.sdf.adf..awefw.d.e$5.00ejfae.fmaf$25.00adsfendlkafeeeeeeji$50.00awef"
foo[/start.+end/].scan(/\$[\d.]+/)
# => ["$5.00", "$25.00"]
Немного разбив его на части:
foo[/start.+end/] # => "starta.sdf.adf..awefw.d.e$5.00ejfae.fmaf$25.00adsfend"
.scan(/\$[\d.]+/) # => ["$5.00", "$25.00"]
Я бы ограничил диапазон небольшим шаблоном, а затем получил бы значения , Попытка сделать это в одном паттерне глупо и сложнее. foo[/start.+end/]
- это срез строки, использующий шаблон .
Регулярные выражения чрезвычайно эффективны, но иногда люди пытаются сделать из них слишком много и исчезают в кроличьей норе, когда вместо этого Если бы они разбили проблему на более мелкие части, их легко решить.
Если вам не нужен ведущий знак доллара, есть много способов его раздеть, вот два:
foo[/start.+end/].scan(/\$[\d.]+/).map { |s| s.delete('$') } # => ["5.00", "25.00"]
foo[/start.+end/].scan(/\$[\d.]+/).map { |s| s[1..-1] } # => ["5.00", "25.00"]
Но входная строка действительно необычна и пахнет как данные сумасшедшие. Я подозреваю, что вы обрабатываете двоичные данные неправильно.