Регулярное выражение для суммы валюты с буквой D для отрицательных сумм или C для положительных сумм - PullRequest
2 голосов
/ 28 мая 2020

Мне нужна помощь с RegEx.

Допустимые значения:

-1.00 D
-2,000.00 D
-100,000.56 D
-100,000.00 D
-1,123,456.43 D

1.00 C
2,000.00 C
100,000.56 C
100,000.00 C
1,123,456.43 C

Перед десятичной (целые числа) может быть до 13 цифр. Десятичное число всегда должно состоять из 2 цифр.

-ve значения будут иметь ПРОБЕЛ, а затем значения D

и

+ ve будут иметь ПРОБЕЛ, а затем C

Помогите, пожалуйста.

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Используйте прогнозирование для утверждения общего формата:

^(?=-.{,21}D|\d.{,20}C)-?\d{1,3}(,\d{3})*\.\d\d [CD]$

См. живую демонстрацию .

1 голос
/ 28 мая 2020

Вы можете использовать следующее регулярное выражение для проверки соответствия строк шаблону.

^(?=-.*D$|\d.*C$)-?(?=(?:\d,?){1,13}\.)(?:0|[1-9]\d{0,2}(?:,\d{3})*)\.\d{2} [DC]$

Demo

Я тестировал это с помощью механизма регулярных выражений PCRE, но он должен работать с любым движком, который поддерживает опережающий просмотр.

Регулярное выражение содержит два положительных опережающих просмотра . Первый утверждает, что строка начинается с дефиса или цифры; если дефис, последний символ должен быть D, если ди git последний символ должен быть C. Второй просмотр вперед утверждает, что строка содержит 1-13 цифр перед десятичной точкой.

Механизм регулярных выражений выполняет следующие операции.

^                match beginning of line

(?=              begin positive lookahead
  -.*D$          match '-', 0+ chars, 'D' at end of line
  |              or
  \d.*C$         match 1 digit, 0+ chars, 'C' at end of line
)                end positive lookahead

-?               optionally match '-'

(?=              begin positive lookahead
  (?:\d,?)       match 1 digit optionally followed by ','
                 in a non-capture group
  {1,13}         execute preceding non-capture group 1-13 times
  \.             match '.'
)                end positive lookahead

(?:              begin non-capture group
  0              match '0' for amounts < '1.00'
  |              or
  [1-9]\d{0,2}   optionally match '-', then match one digit
                 other than '0', then 0-2 digits   
  (?:,\d{3})     match ',' then 3 digits in non-capture group
  *              execute preceding non-capture group 0+ times
)                end non-capture group
\.\d{2} [DC]     match '.', 2 digits, 1 space 'D' or 'C'
$                match end of string

Якоря конца строки в первом просмотре вперед на самом деле не нужны (из-за привязки конца строки в конце регулярного выражения), но я включил их для улучшения читаемости.

...