Для проекта мне нужно заменить пробелы
если — и только если — они происходят в предопределенном формате валюты.
Например:
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).
Чтобы сопоставить все пробелы, начиная с аббревиатуры валюты, до всех тех, которые находятся между цифрами и после, вам необходимо работать \G
метасимволом:
(?:EUR|USD|GBP|\G(?!^)\d+(?:\.\d+)?)\K +
Увидеть живое демо здесь
Это объяснение:
(?:
Начало группы без захвата
EUR|USD|GBP
Совпадение с одним из названий валют|
Или же\G(?!^)
Начать матч с того места, где он заканчивается ранее\d+(?:\.\d+)?
Совпадение последовательности цифр после необязательной дробной части)
Конец не захвата\K +
Сбросить совпадение вывода и сразу искать пробелыДругих решений пока нет …