Правила для Firebase Regex Birthday - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь проверить дни рождения, используя следующее регулярное выражение:

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

Это регулярное выражение работает при тестировании в онлайн-тестере регулярных выражений, но когда я пытаюсь использовать это регулярное выражение в моих правилах Firebase, Firebase, кажется,не принять это.Я также попытался удвоить свои обратные слэши, но все равно не повезло.

Это мое правило для firebase:

".validate": "newData.isString() && newData.val().matches(/^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$/)"

Это ошибка, которую я получаю в Firebase: "Недопустимое регулярное выражение, unescaped ^, ^может появляться только в конце регулярных выражений "

Как я могу настроить это регулярное выражение, чтобы оно работало на Firebase?

1 Ответ

0 голосов
/ 28 мая 2018

Здесь необходимо сделать две вещи:

  • убедиться, что все обратные слэши удвоены
  • превратить все группы без захвата в группы захвата и заново настроить обратные ссылки (обратите внимание, чтоизбыточные группы захвата должны быть исключены) (обратите внимание, что вы не можете использовать \15 в качестве обратной ссылки, кажется, что поддерживаются только от 1 до 9 обратных ссылок)
  • переназначить шаблон так, чтобы ^ начало строкиanchor появился в начале и $ только в конце регулярного выражения (в противном случае вы получите недопустимое исключение регулярного выражения).Это легко сделать, так как ваш паттерн относится к типу ^a1$|^a2$|^a3$ и равен ^(?:a1|a2|a3)$.

Паттерн должен выглядеть как

newData.val().matches(/^((31([-\\/.])(0?[13578]|1[02])\\3|(29|30)([-\\/.])(0?[13-9]|1[0-2])\\6)(1[6-9]|[2-9]\\d)?\\d{2}|29([-\\/.])0?2\\9((1[6-9]|[2-9]\\d)?(0[48]|[2468][048]|[13579][26])|(16|[2468][048]|[3579][26])00)|(0?[1-9]|1\\d|2[0-8])([-\\/.])(0?[1-9]|1[0-2])[-\\/.](1[6-9]|[2-9]\\d)?\\d{2})$/)

Примечаниечто я также превратил (\/|-|\.) в ([-\/.]) (поскольку класс символов более эффективен, чем обычное чередование с альтернативами с одним символом) и удалил запятую из [1,3-9] - это похоже на опечатку, которую вы хотели сопоставить 1или цифра от 3 до 9, я полагаю, а , трактуется буквально в классе символов.

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