PCRE 正则表达式匹配带格式货币的空格

PCRE Regex matching spaces in formatted currency

对于一个项目,我需要用   替换 space,当且仅当它们以预定义的货币格式出现时。

例如:

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][space][金额[with_spaces]][后缀]

这是我到目前为止的想法:

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

参见:https://regex101.com/r/z73ISR/5

问题是:它只匹配 space 3 次。我需要匹配它 [n] 次(参见 GBP 示例)。

要匹配从货币缩写开始的所有空格到数字之间和之后的所有空格,您需要使用 \G 元字符:

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

参见 live demo here

这是解释:

  • (?: 非捕获组开始
    • EUR|USD|GBP匹配其中一个货币名称
    • |
    • \G(?!^) 从之前结束的地方开始比赛
    • \d+(?:\.\d+)? 匹配可选小数部分后的数字序列
  • )非捕获结束
  • \K + 重置匹配输出并立即查找空格