Регулярное выражение допускает 1 ведущий ноль только перед плавающей десятичной дробью - PullRequest
0 голосов
/ 01 февраля 2019

В настоящее время у меня есть следующее регулярное выражение:

/^[0-9]{0,13}(?:\.[0-9]{0,2})?$/

это позволяет:

  • от 0 до 13 цифр от 0 до 9 до десятичной дроби
  • 0 до2 цифры после запятой

проходящий в данный момент:

1000900.87
65677987897
908181.0
.89
9879
0.89
0.9

Однако я бы хотел, чтобы разрешалось только 1 ведущий 0.

В настоящее время эти передачи иЯ хотел бы, чтобы они потерпели неудачу:

00000001.89
000.76

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Ваше текущее регулярное выражение соответствует одной точке, но также соответствует пустой строке, поскольку все части являются необязательными из-за {0,13} и )?

Если вы не хотите сопоставлять пустую строку,Вы можете использовать чередование , соответствующее 1-13 цифрам, за которым следует необязательная часть, которая соответствует точке и 1-2 цифрам, или | соответствует только точке, за которой следуют 1-2 цифры.

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

^(?:(?!0{2,})\d{1,13}(?:\.\d{1,2})?|\.\d{1,2})$

См. Демонстрационную версию regex

  • ^ Начало строки
  • (?: Группа без захвата
  • (?!0{2,}) Отрицательный взгляд в будущее, чтобы убедиться, что следующее не 2или больше нулей
  • \d{1,13}(?:\.\d{1,2})? Совпадение 1-13 цифр с необязательной деталью, которая соответствует точке и 1-2 цифрам
  • | Или
  • \.\d{1,2}) Совпадениеточка и 1-2 цифры
  • $ Конец строки

Редактировать: Как указано @PushpeshKumarRajwanshi, если оно также подходит для совпадения с точкой в ​​концеВы можете добавить третье чередование |\d+\., соответствующее 1+ цифрам, за которым следует точка:

^(?!0{2,})(?:\d{1,13}(?:\.\d{1,2})?|\.\d{1,2}|\d+\.)$

См. обновленную демонстрационную версию Regex

0 голосов
/ 01 февраля 2019

Вы можете просто использовать отрицательный взгляд (?!0{2,}) вперед, чтобы отклонить совпадение, которое содержит более двух ведущих нулей в вашем входе.Используйте это регулярное выражение,

^(?!0{2,})[0-9]{0,13}(?:\.[0-9]{0,2})?$
 ^^^^^^^^^ This negative look ahead will reject the match if it sees more than two leading zeroes

Демо

Однако вы также можете использовать одну точку . в качестве действительной, которую я неЯ думаю, что вам следует разрешить и отклонить это, просто добавьте еще один негативный взгляд вперед (?!\.$), и ваше регулярное выражение станет лучше,

^(?!0{2,})(?!\.$)[0-9]{0,13}(?:\.[0-9]{0,2})?$

Демонстрация, не позволяющая использовать только одну точку

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