Вы можете использовать следующее регулярное выражение для проверки соответствия строк шаблону.
^(?=-.*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
Якоря конца строки в первом просмотре вперед на самом деле не нужны (из-за привязки конца строки в конце регулярного выражения), но я включил их для улучшения читаемости.