Почему ruby ​​REGEX \ A ... \ z позволяет вводить что-либо в начале? - PullRequest
0 голосов
/ 07 сентября 2018

Этот рубиновый REGEX разрешает знаки + и в начале, и я понятия не имею, почему.

 REGEX = /\A0(\d{4,14})|((\d{1,4}-\d{1,4}-\d{3,4}))\z/

Кажется, проблема решается, когда я делаю части между A ... \ z ихсобственная группа, но меня это беспокоит, и я был бы признателен за объяснения от более опытного человека.

 REGEX = /\A(0(\d{4,14})|((\d{1,4}-\d{1,4}-\d{3,4})))\z/

Некоторые другие вещи, на которые стоит обратить внимание, я использую это как подтверждение для поля формы внутри рельсовпроект.REGEX сохраняется как константа и сравнивается с входом с помощью функции validates: ... {with: REGEX}.

1 Ответ

0 голосов
/ 07 сентября 2018

Это может произойти из-за того, что вы не включили \A во второй вариант.

& или + или любой другой символ в этом отношении будет совпадать в начале вашей строки - если оставшаяся часть регулярного выражения соответствует ((\d{1,4}-\d{1,4}-\d{3,4}))\z

Давайте предположим, что разделитель не существует, и давайте просто рассмотрим второй вариант:

((\d{1,4}-\d{1,4}-\d{3,4}))\z

Вы не утверждаете никаких требований начала строки (обратите внимание: \A не существует в этой альтернативе - также как \z не существует в вашей первой альтернативе.)

Итак, попробуйте любой из них, он должен работать для вас.

/\A0(\d{4,14})\z|\A0((\d{1,4}-\d{1,4}-\d{3,4}))\z/

или

/\A0(?:(\d{4,14})|((\d{1,4}-\d{1,4}-\d{3,4})))\z/

Онлайн отладчик регулярных выражений может помочь вам отладить ваш шаблон. Взгляните на две альтернативы здесь:

enter image description here

Обратите внимание, что синий (красиво нарисованный) круг не показывает ваш \z, а также красный круг не показывает \A0?

И слегка укороченный / оптимизированный шаблон:

/\A0(?:\d{4,14}|(?:\d{1,4}-){2}\d{3,4})\z/

Я немного запутался, почему у вас есть две группы захвата, которые захватывают одну и ту же строку. ((\d{1,4}-\d{1,4}-\d{3,4})). Вам, вероятно, следует отбросить один из них, так как он кажется излишним.

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