Почему это регулярное выражение терпит неудачу, когда есть лишний ноль?

Я создал это регулярное выражение, чтобы сопоставить сумму в долларах более 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

Как исправить это регулярное выражение?

«более 9 000,00 долларов США»: вы имеете в виду, что это должно соответствовать 9 000,01 долларов США, но не 9 000,00 долларов США?

trincot 14.02.2023 20:51

@trincot он должен соответствовать 10 000 долларов США или более, но не 9 000 долларов США или 9 999 долларов США.

FinAnalyst 14.02.2023 21:03

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

trincot 14.02.2023 21:04

@trincot Да, это максимум.

FinAnalyst 14.02.2023 21:06

Любые требования о количестве десятичных знаков? Очевидно, вы хотите принять один десятичный знак и два. Более? Вы бы отклонили всю сумму, когда есть 3 десятичных знака? Или вы бы все равно приняли, но не соответствовали бы 3-му десятичному знаку? Или вы бы приняли все десятичные дроби независимо от их количества?

trincot 14.02.2023 21:13

@trincot У нас может быть только 2 десятичных знака, но десятичные знаки могут быть необязательными. Я не принимаю 3 десятичных знака.

FinAnalyst 14.02.2023 21:17

Было бы хорошо, если бы вы отредактировали свой вопрос и добавили эти дополнительные требования.

trincot 14.02.2023 21:34

Ну, я только что потратил свое время на Cash over $9,000.00. Приходите, чтобы узнать в комментариях, что это не номер. Хотел бы я удалить его.

sln 14.02.2023 23:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
8
69
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Некоторые проблемы в вашем регулярном выражении:

  • Утверждение просмотра вперед требует, чтобы совпадение могло начинаться только с последних 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))

На регулярном выражении101

Чтобы разрешить одинаковые числа без запятых, добавьте \d{5,9} в качестве опции:

\$(?:\d{2,3}(?:,\d{3})|\d{1,3}(?:,\d{3}){2}|\d{5,9})(?:(?![,.]?\d)|\.\d\d?(?!\d))

На регулярном выражении101

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

FinAnalyst 14.02.2023 21:39

Добавил это к моему ответу.

trincot 14.02.2023 21:50

Совершенно новый ответ. При ближайшем рассмотрении вижу, что переделали
уточнения по этому вопросу.

Я отправляю это решение на основе диапазона от 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 )

Другие вопросы по теме

Почему оператор bash «=~» игнорирует последнюю часть указанного шаблона?
Разобрать отформатированную строку с метками, написанными ЗАГЛАВНЫМИ БУКВАМИ, за которыми следует их значение, для создания ассоциативного массива
Разделить строку с помощью разделителей и поместить их в несколько строк в sql, не работающем
Регулярное выражение с флагом m в Perl и Python
Как выполнить разделение строк, используя регулярное выражение в качестве ссылки, и чтобы часть используемого шаблона разделителя не удалялась из следующей строки?
Правильный шаблон регулярного выражения (re) в python
Как я могу преобразовать двойные косые черты в R, не сталкиваясь с ошибкой, связанной с escape-символами?
JavaScript Буквенно-цифровое регулярное выражение и разрешить звездочку в начале строки, но не разрешать звездочку в последних 4 цифрах строки
Python/regex: соответствует только букве или букве, за которой следует число
Регулярное выражение для форматирования электронной почты без hypen в начале и в конце