2016-11-21 4 views
1

Im пытается создать тег ввода html, который принимает только числа, введенные в 1 из 2 форматов, и отклоняет все другие входные данные.Почему и я получаю: «Недопустимое регулярное выражение. Неиспользуемый SyntaxError. Invalid escape.»?

Я хочу принять номера только в этих форматах, в том числе требующих черточки:

1234-12 

и

1234-12-12 

Примечание: это не даты, а юридические номера глав

Все, что я читаю о регулярном выражении, говорит, что следующее должно работать, но это не так.

<input class="form-control" 
         type="text" 
         pattern="^(\d{4}\-\d{2}\-\d{2})|(\d{4}\-\d{2})$" 
         required /> 

Devtools Консоль ошибок в Chrome:

Pattern attribute value ^(\d{4}\-\d{2}\-\d{2})|(\d{4}\-\d{2})$ is not a valid regular expression: Uncaught SyntaxError: Invalid regular expression: /^(\d{4}-\d{2}-\d{2})|(\d{4}-\d{2})$/: Invalid escape

+4

Замените '\ -' на' -'. –

+2

Вы получаете «недействительный escape», потому что у вас есть недействительный escape в вашем регулярном выражении. Вне класса символов ('[]') '-' не имеет особого значения. Таким образом '\ -' является недействительным. –

+1

@ T.J.Crowder: Я думаю, что запутанная часть здесь состоит в том, что '/ \ - /' является законным регулярным выражением в JS, а '/ \ -/u' - нет. Обычно (т. Е. Почти везде) идентификационные экраны не являются ошибкой, но разрешены, хотя и строго не нужны. – Joey

ответ

3

Вы не должны бежать дефис вне класса символов в ES6 регулярное выражение используется с u флагом (который используется по умолчанию в pattern регулярных выражений в текущие версии Chrome и FF).

Кроме того, регулярное выражение в атрибуте шаблона закреплено по умолчанию, удалить redudant ^ и $ и сократить шаблон с помощью дополнительных групп

pattern="\d{4}-\d{2}(-\d{2})?" 

Это регулярное выражение в атрибуте HTML5 pattern означает:

  • \d{4}-\d{2} - матч 4 цифры, -, а затем 2 цифры от начала строки
  • (-\d{2})? - и необязательно совпадают -, а затем 2 цифры в конце строки.
+0

Я добавил разъяснение: внутри класса символов дефис может быть экранирован даже в регулярном выражении ES6 с модификатором 'u', поскольку внутри символьного класса' -' может иметь особое значение. –

+1

Спасибо! Это прекрасно работает! – Jason

+1

О да, абсолютно, я не знал об этом раньше. Еще раз спасибо! – Jason