PCRE Regex соответствующие пробелы в отформатированной валюте

Для проекта мне нужно заменить пробелы   если — и только если — они происходят в предопределенном формате валюты.

Например:

EUR 1.2
EUR 1.23
EUR 12
EUR 123
EUR 12 Mio.
EUR 12 345 Mio.
GBP 1 123 456 789 Mio. <---- this one is a problem, only matching the first, second to last and last one, but not those inbetween
USD 12 million
EUR 1.23 billion

Таким образом, в основном [CurrencyPrefix] [пробел] [сумма [with_spaces]] [Суффикс]

Это то, что я придумал до сих пор:

(?:EUR|USD|GBP)(\ )(?:(?:(?:\d+(\ ))+\d+)|\d+\.\d+|\d+)+(?:(\ )(?:Mio\.|million|billion))?

Увидеть: https://regex101.com/r/z73ISR/5

Проблема в том, что он соответствует пространству только 3 раза. Мне нужно сопоставить его [n] раз (см. Пример GBP).

1

Решение

Чтобы сопоставить все пробелы, начиная с аббревиатуры валюты, до всех тех, которые находятся между цифрами и после, вам необходимо работать \G метасимволом:

(?:EUR|USD|GBP|\G(?!^)\d+(?:\.\d+)?)\K +

Увидеть живое демо здесь

Это объяснение:

  • (?: Начало группы без захвата
    • EUR|USD|GBP Совпадение с одним из названий валют
    • | Или же
    • \G(?!^) Начать матч с того места, где он заканчивается ранее
    • \d+(?:\.\d+)? Совпадение последовательности цифр после необязательной дробной части
  • ) Конец не захвата
  • \K + Сбросить совпадение вывода и сразу искать пробелы
2

Другие решения

Других решений пока нет …