Как захватить несколько экземпляров шаблона между двумя другими шаблонами - PullRequest
0 голосов
/ 07 марта 2020

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

starta.sdf.adf..awefw.d.e$5.00ejfae.fmaf$25.00adsfendlkafeeeeeeji$50.00awef

, и мне нужно извлечь суммы в долларах между start и end.

Использование (?:.+?\$(\d+\.\d{2})) дает мне все суммы включая тот, который после end, который мне не нужен.

Изменение регулярного выражения на (?:.+?\$(\d+\.\d{2})).+end приводит к захвату только одного экземпляра.

Добавление плюса после группы захвата, например : (?:.+?\$(\d+\.\d{2}))+.+end, похоже, ничего не меняет и повторяет шаблон, как я ожидал.

Ожидаемый результат:

0: 5.00
1: 25.00

Как я могу перехватить несколько экземпляров этого шаблона между стартом и конец паттернов?

1 Ответ

2 голосов
/ 07 марта 2020

Я бы сделал что-то вроде этого:

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"]

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...