PCRE Regex соответствующие пробелы в отформатированной валюте - PullRequest
0 голосов
/ 05 октября 2018

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

Например:

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] [пробел] [количество [с_пространствами]] [Суффикс]

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

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

См .: https://regex101.com/r/z73ISR/5

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

1 Ответ

0 голосов
/ 05 октября 2018

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

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

См. живое демо здесь

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

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