Регулярное выражение для проверки чисел до и после десятичной дроби, исключая запятую

#regex #validation #matching

#регулярное выражение #проверка #соответствие

Вопрос:

Я пытаюсь проверить десятичное число из 13 цифр до и 4 цифр после точки, исключая запятую, т. е. запятая не должна учитываться как цифра.

Допустимые Случаи

 1,234,567,890,123.1234

1234567890123.1234

123456789012.1234

1234567890123.123

12345.123

1.2

0
  

В допустимых случаях

 12345abc.23 // string or special characters  not allowed

1,234,567,890,1231.1234

1,234,567,890,123.12341

12345678901231.1234

1234567890123.12341
  

Текущее Регулярное выражение

 ^[0-9]{1,13}(.[0-9]{0,4})?$
  

В настоящее время Regex запятая считается цифрой.

Любая помощь была бы отличной.

Ответ №1:

Вы могли бы использовать отрицательный прогноз, чтобы утверждать, что то, что находится непосредственно справа, не является 14-кратной цифрой перед сопоставлением с точкой:

 ^(?!(?:[^.sd]*d){14})-?d (?:,d{1,3})*(?:.d{1,4})?$
  

Объяснение

  • ^ Начало строки
  • -? Необязательный дефис
  • (?! Отрицательный прогноз, утверждение, что следующее не
    • (?:[^.sd]*d){14} Не используйте цифру, символ пробела или точку 14 раз
  • ) Закройте предварительный просмотр
  • d Сопоставьте 1 цифр
  • (?:,d{1,3})* Сопоставьте запятую, 1-3 цифры и повторите 0 раз (или используйте d )
  • (?:.d{1,3})? Необязательная часть, сопоставьте точку и 1-4 цифры
  • $ Конец строки

Демонстрация регулярного выражения

Комментарии:

1. Спасибо, отлично работает для 10 цифр до и 3 цифр после точки, но я изменил для проверки 13 цифр до и 4 цифр после точки, как показано ниже, но не работает для ввода 9,999,999,999,999.1234 . ?

2. @stom Вы можете расширить последний квантификатор до {1,4} типа ^-?(?!(?:[^DS.]*d){11})d (?:,d{3})*(?:.d{1,4})?$

3. Изменить на ^-?(?!([^DS.]*d){14})d (?:,d{4})*(?:.d{1,4})?$ , не работает, почему?

4. Теперь я хочу проверить 13 цифр до и 4 цифры после точки. т. е. это допустимо: 9,999,999,999,999.1234 Должен ли я обновить вопрос?

5. Отлично, это сработало, большое вам спасибо, ценю. 🙂

Ответ №2:

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

 ^[0-9]{0,1}([,])?[0-9]{0,3}([,])?[0-9]{0,3}([,])?[0-9]{1,3}(.[0-9]{0,3})?$