Регулярное выражение не соответствует полному вводу - PullRequest
2 голосов
/ 22 июня 2019

Почему регулярное выражение ([£ € $ ¥ £] | USD | US \ $) \ s? (\ D *.? \ D + | \ d {1,3} (, \ d {3})* (. \ d +)?) не соответствует US $ 150 000,00

Регулярное выражение 1:

([£€$¥£]|USD|US\$)\s?

соответствует US $

Регулярное выражение 2:

 (\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)

соответствует 150 000,00

Объединение двух выражений

([£€$¥£]|USD|US\$)\s?(\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?)

не соответствует US $ 150 000,00

демо: https://regex101.com/r/fJJWqv/1

РЕДАКТИРОВАТЬ:Регулярное выражение 2 не соответствует 150 000,00, но не должно совпадать с запятой из-за (, \ d {3}) *?

Ответы [ 2 ]

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

В 150,000.00 при использовании шаблона (\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?) он не будет соответствовать запятой, потому что 150 будет соответствовать \d*\.?\d+, и ни одна из альтернатив не начинается с запятой.

Это возможно, потому что \d* означает 0+ цифр, так что будет соответствовать 150. Тогда \.? является необязательной точкой, поэтому она продолжается до \d+.

Из-за отслеживания пути \d* может отказаться от одного совпадения, чтобы соответствовать хотя бы 1 цифре из \d+, и 150 останется в матче.

Тогда следующий символ - ,, но чередование не начинается с запятой, поэтому следующий символ пробуется, и на этот раз этот шаблон \d*\.?\d+ может соответствовать 000.00.

Один вариант, который соответствует вашему значению (и если вы хотите только совпадение, вы можете опустить группы захвата), вы удалите эту часть \d*\.?\d+

(?:[£€$¥£]|USD|US\$)\s?\d{1,3}(?:,\d{3})*(?:\.\d+)?

Regex demo

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

Ваше второе утверждение не соответствует действительности. (\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?) не соответствует 150,000.00. Скорее, это соответствует 150 и 000.00. Так как только первый префикс US $, только он соответствует третьему регулярному выражению.

Причина этого в том, что указанный порядок чередования благоприятствует более короткому совпадению. Чтобы исправить это, вы можете изменить порядок чередования: измените (\d*\.?\d+|\d{1,3}(,\d{3})*(\.\d+)?) на (\d{1,3}(,\d{3})*(\.\d+)?|\d*\.?\d+).

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