регулярное выражение, чтобы поймать любую валюту до $ 300K - PullRequest
0 голосов
/ 07 июня 2019

У меня есть требование указать любые значения до 300 000 в поле валюты. Я создал регулярное выражение, которое будет делать это для любого числа менее 1 миллиона, но мне нужно сократить его до 299 999,99 долларов США.

Код для 1 миллиона указан ниже.

^\$?\d{0,3}?\d{0,2},?\d{0,3}(\.(\d{0,2}))?$

Ответы [ 3 ]

1 голос
/ 08 июня 2019

Вот, пожалуйста, $300,000.00 - $1,000,000.00

(?<!\S)\$?(3\d{2},?\d{3}|[4-9]\d{2},?\d{3}|10{6}|1,?000,?000)(\.\d{0,2})?(?!\S)

Читаемая версия

 (?<! \S )
 \$?
 (                             # (1 start)
      3 \d{2} ,? \d{3} 
   |  [4-9] \d{2} ,? \d{3} 
   |  1 0{6}
   |  1 ,? 000 ,? 000
 )                             # (1 end)
 (                             # (2 start)
      \.
      \d{0,2} 
 )?                            # (2 end)
 (?! \S )
0 голосов
/ 08 июня 2019

Вы можете использовать следующее регулярное выражение: ^\$[0-2]?[0-9]{0,2},?[0-9]{0,3}(\.[0-9]+)?$

См. Пояснение к regex101 ...

enter image description here

Здесь вы можете визуализировать свое регулярное выражение ...

0 голосов
/ 07 июня 2019

Регулярное выражение здесь не лучший выбор.

Чтобы проиллюстрировать это, я буду использовать регулярное выражение, которое вы разместили для дела за 1 миллион долларов. Мне кажется, что вы пытаетесь приспособиться к различным условиям, включая такие, как:

$10      vs.  $10.00
$100     vs.  100
$100     vs.  $10000
$10,000  vs.  $100,000
etc.

Но то, как вы это делаете, позволяет такие вещи:

$10000000.00

потому что:

$            matches  ^\$?
100          matches  \d{0,3}?
00           matches  \d{0,2}
[no comma ]  matches  ,?
000          matches  \d{0,3}
.00          matches  (\.(\d{0,2}))?$

(проверено с https://regex101.com/)

Иными словами, ваша попытка сопоставить такие вещи, как отсутствие запятой для небольших чисел и наличие запятой для больших чисел, а также различные группировки цифр, которые могут встречаться в маленьких, средних и больших числах, приводит к регулярному выражению это соответствует числу, намного превышающему 1 миллион долларов.

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

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

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

...