Регулярное выражение JavaScript для YYYY-MM-DD с необязательным месяцем и днем - PullRequest
0 голосов
/ 06 ноября 2018

Я придумал следующее регулярное выражение PCRE:

[12]\d{3}(-)?(?(1)(0[1-9]|1[0-2]))(-)?(?(3)(0[1-9]|[12]\d|3[01]))

Соответствует следующим форматам даты:

  • 2018-10-03
  • 2011-03
  • 2003

Как видите, я использую условные операторы для определения наличия тире, указывающего на следующую часть даты. К сожалению, javascript не поддерживает условные выражения. Как я могу преобразовать это в RegExp? Я пытался использовать группы без захвата, содержащие альтернативы, но мне не удалось это сделать.

EDIT:

Я не могу использовать никакие функции JS, потому что регулярное выражение будет использоваться в свойстве ввода pattern HTML5.

Ответы [ 3 ]

0 голосов
/ 06 ноября 2018

Вы можете использовать это регулярное выражение:

[12]\d{3}(?:(?:-(?:0[1-9]|1[0-2]))(?:-(?:0[1-9]|[12]\d|3[01]))?)?

В основном это соответствует году, затем создается группа без захвата с month и date. Часть date в этой группе optional, а the Whole Group с месяцем и датой также optional.

Это означает, что он будет соответствовать только годам, годам и месяцам, а полные даты указывать год, месяц и дату.

Редактировать (добавлены якоря):

^[12]\d{3}(?:(?:-(?:0[1-9]|1[0-2]))(?:-(?:0[1-9]|[12]\d|3[01]))?)?$

Теперь он не будет совпадать с '2018-ааа'.

0 голосов
/ 06 ноября 2018

регулярное выражение для YYYY-MM-DD шаблона с необязательным месяцем и днем ​​

var regex = /((([12]\d{3})(-(0[1-9]|1[0-2]))*)(-(0[1-9]|[12]\d|3[01]))*)/;
0 голосов
/ 06 ноября 2018

Вот версия без регулярных выражений, которую я хотел сделать

var dates = ["2018-10-03","2011-03","2003","12234"]

function isDate(str) {
  var parts = str.split("-"), 
      d = new Date(parts[0],parts.length>1?parts[1]-1:0,parts.length==3?parts[2]:1,12,0,0,0),
      yearOk=parts[0] < 3000 && d.getFullYear()==parts[0]; // or whatever test
  if (parts.length==1) return yearOk;
  var monthOk = +parts[1] == d.getMonth()+1;
  if (parts.length==2) return yearOk && monthOk;
  return yearOk && monthOk &&  +parts[2] == d.getDate();
}
dates.forEach(function(dStr) { console.log(isDate(dStr)) })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...