Я создал это регулярное выражение, чтобы сопоставить сумму в долларах более 9000,00 долларов.
\$(?=.{6,11}$)\d{1,3}(?:,\d{3})*
Но это терпит неудачу в подобных случаях,
$25,000.00. Text Goes here
$1,000,000.00
Однако это работает в таких случаях,
$25,000.0. T
$25,000.00
$999,000.00
Как исправить это регулярное выражение?
@trincot он должен соответствовать 10 000 долларов США или более, но не 9 000 долларов США или 9 999 долларов США.
Есть ли максимальная сумма? 11
, кажется, предполагает это, но вы ничего об этом не упоминаете.
@trincot Да, это максимум.
Любые требования о количестве десятичных знаков? Очевидно, вы хотите принять один десятичный знак и два. Более? Вы бы отклонили всю сумму, когда есть 3 десятичных знака? Или вы бы все равно приняли, но не соответствовали бы 3-му десятичному знаку? Или вы бы приняли все десятичные дроби независимо от их количества?
@trincot У нас может быть только 2 десятичных знака, но десятичные знаки могут быть необязательными. Я не принимаю 3 десятичных знака.
Было бы хорошо, если бы вы отредактировали свой вопрос и добавили эти дополнительные требования.
Ну, я только что потратил свое время на Cash over $9,000.00
. Приходите, чтобы узнать в комментариях, что это не номер. Хотел бы я удалить его.
Некоторые проблемы в вашем регулярном выражении:
Утверждение просмотра вперед требует, чтобы совпадение могло начинаться только с последних 11 символов входной строки, поскольку оно имеет привязку $
как минимум после 6 и не более 11 символов. Поэтому неудивительно, что «25 000 долларов США. Здесь идет текст» не совпадает. Я полагаю, вам не нужен этот якорь $
, и тогда 11 тоже больше не пригодится.
Утверждение просмотра вперед требует, чтобы после символа валюты шло не менее 6 символов, однако это может включать нецифровые символы, и поэтому ваше регулярное выражение будет соответствовать сумме в «$300 oh» (6 символов следуют после символа валюты).
В вашем регулярном выражении нет положения для десятичных знаков, хотя вы говорите, что оно работает для примеров с десятичными знаками. Но он не будет включать эти десятичные дроби в совпадение. Например, для ввода «300 000,50 долларов» будет соответствовать только «300 000 долларов», а не 50 центов. Вам нужно будет принять необязательную десятичную точку, за которой следует одна или две цифры, а затем потребовать, чтобы десятичных цифр больше не было с отрицательным прогнозом.
Утверждение с опережением не является подходящим местом для наложения максимальной суммы, потому что, когда вы удаляете $
(см. Первый пункт), вы все равно должны требовать, чтобы после 11-й позиции больше не было цифр. Вместо этого просто удалите прогнозное утверждение и сопоставьте нужные шаблоны более подробно. Есть только два варианта: либо у вас есть 2 или 3 цифры, за которыми следует одна группа цифр (для сумм от 10 000 до 999 999,99), либо у вас есть от 1 до 3 цифр, за которыми следуют группы из двух цифр (для сумм от 1 000 000 до 999 999 999,99). Чтобы избежать появления дополнительных цифр, когда не существует десятичной части, используйте отрицательное утверждение с опережением: (?![,.]?\d)
.
Все это учтено в данной поправке:
\$(?:\d{2,3}(?:,\d{3})|\d{1,3}(?:,\d{3}){2})((?![,.]?\d)|\.\d\d?(?!\d))
Чтобы разрешить одинаковые числа без запятых, добавьте \d{5,9}
в качестве опции:
\$(?:\d{2,3}(?:,\d{3})|\d{1,3}(?:,\d{3}){2}|\d{5,9})(?:(?![,.]?\d)|\.\d\d?(?!\d))
Спасибо, это работает. Я был бы признателен, если бы вы также добавили поддержку версии без запятой, чтобы я мог сопоставить обе в одном регулярном выражении.
Добавил это к моему ответу.
Совершенно новый ответ. При ближайшем рассмотрении вижу, что переделали
уточнения по этому вопросу.
Я отправляю это решение на основе диапазона от 10 000,00 до 999 999 999,00 долларов США.
недопустимых денежных сумм. Запятая и десятичная дробь не обязательны.
После точки не может быть более 2 последовательных десятичных чисел.
Ах, другие характеристики сомнительны.
Обратите внимание, что текстовое представление ведущих нулей не допускается, что является
различие, которое стоит изучить, поскольку класс цифр \d
охватывает символы от 0 до 9.
Трудно, если вообще возможно, соответствовать бесконечности.
Например, ОП запросил сопоставить наличные на сумму более 9000 долларов (ах, 10 000 долларов).
Regex не имеет представления квантификаторов, представляющих бесконечность, поэтому
@Trincot пытался уговорить его назвать максимальную сумму наличными, чтобы ограничить ее.
В действительности, вы можете сопоставить бесконечное только с отрицанием конечного.
Так что это в космосе, как и в регулярном выражении.
Единственный реальный способ сопоставить число, большее другого числа, — это
утверждают, что он не находится в конечном диапазоне. В данном случае не в диапазоне от 0 до 9999 долларов.
В этом случае они установили диапазон, в котором наличные деньги быть не могут.
По-видимому, это диапазон от 10 000 до 999 999 999 долларов, который
абсолютно не представляет все значения, превышающие 10 000,00 долларов США.
Мой первоначальный ответ состоял в том, чтобы сопоставить от 0 до 9000 долларов (исходный минимум), а затем опубликовать это регулярное выражение в отрицательном утверждении, тем самым сопоставив бесконечный набор значений
более 9000 долларов, что было и остается единственным ответом на сопоставление денежных сумм, превышающих
фиксированная сумма.
В конце концов, синтаксический анализ значений — это только преамбула к тому, чтобы превратить их в поплавок
и нет никакого способа получить окончательное значение перед этим преобразованием.
Таким образом, это действительно упражнение в бесполезности.
С этой целью :
10 000 000–999 999 999 долларов США
\$[1-9](?:\d{1,2}(?:,?\d{3}){1,2}|(?:,?\d{3}){2})(?:\.\d{0,2})?(?![,.]?\d)
https://regex101.com/r/1h4XW9/1
\$ [1-9]
(?:
\d{1,2}
(?: ,? \d{3} ){1,2}
| (?: ,? \d{3} ){2}
)
(?: \. \d{0,2} )?
(?! [,.]? \d )
«более 9 000,00 долларов США»: вы имеете в виду, что это должно соответствовать 9 000,01 долларов США, но не 9 000,00 долларов США?