Regex соответствует первым числам и позволяет только 11 - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь создать регулярное выражение, которое проверяет первые 6 чисел из 11 в этом формате даты 'yymmdd' и проверяет, что оно содержит только 11 чисел.

Пример: 06060612345

^((0[1-9]|[1-2][0-9]|31(?!(?:0[2469]|11))|30(?!02))(0[1-9]|1[0-2])(0?[0-9]|[1-9][0-9]))

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Как указано в комментариях, использование регулярных выражений для проверки не работает. Облегчите себе задачу, используя регулярное выражение типа const match = "06060612345".match(/^(\d{2})(\d{2})(\d{2})(\d{5})$/). Затем с помощью Date.parse:

// Generates our yyyy/mm/dd date string for our argument.
const date = [20 + match[1], match[2], match[3]].join('/'); 

// And to check validity you can use this instead of the
// massive moment js lib as suggested in the comments.
const isValid = !isNaN(Date.parse(date));

И, если необходимо, дополнительные цифры в match[4].

1 голос
/ 16 марта 2020

Это:

^((0[1-9])|([1-9]{2}))((0[1-9]|1[0-2]))(0[1-9]|[1-2][0-9]|(?<!(?:(0[2469])|11))31|(?<!02)30)\d{5}$

близко к тому, что вы ищете. Формат должен быть в порядке, но он также принимает некоторые недопустимые даты, такие как 192901

Это также причина, почему вы хотите избежать использования регулярных выражений для таких задач. Если вы используете это для чего-то сложного. Предполагая, что ваше регулярное выражение поддерживает рекурсию, вы можете использовать некоторые трюки по модулю для проверки високосных лет, но опять-таки, я действительно действительно советую вам не делать этого, если нет конкретной причины c или служит для развлекательных целей (например, какая-то задача программирования)

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