Jump to content
  • 0

Регулярное выражение - в чем ошибка?


Zverushka
 Share

Question

Подскажите в чем ошибка?

!phone.match(/^\+?[\d+\s*\-*]$/)

Я хочу, чтобы можно было ввести 1 плюсик (или ноль) и дальше больше либо одна цифра и можно ввести пробел - можно не ввести, можно ввести тире - можно не ввести, но это не являлось обязательным условием и не была важна последовательность. По идее вот в любом порядке должны принимать знаки, но не принимаются [\d+\s*\-*] - одна или больше цифра, ноль или больше пробел и тире в любом порядке. Но что-то не так!

Link to comment
Share on other sites

16 answers to this question

Recommended Posts

  • 0

Из описания ничего не ясно.

Согласен, прям шифрограмма какая-то...

можно ввести пробел - можно не ввести

\+?

дальше больше либо одна цифра

\d+

можно ввести тире - можно не ввести, можно ввести пробел - можно не ввести, но это не являлось обязательным условием и не была важна последовательность

( |-)?

Итого, регулярка, которая отработает для строк

"+1213-"

"1213 "

"23443"

^\+?\d+( |-)?$

Edited by CoDy
  • Like 1
Link to comment
Share on other sites

  • 0

Я могу ошибаться, но это же все спецсимволы и они должны быть экранированы?

В общем загвоздка описываю -

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

Мне кажется удалось это сделать, но правильно ли?

phone.match(/^\+?[\d*\s*\-*\(*\)*]*$/)

УПД. Ничего не правильно. Вот так должно быть правильно


!phone.match(/^\+?[\d+\s*\-*\(*\)*]+$/)

Но код без цифры считается валидным и непонятно почему. сказано же цифры больше или 1 раз. и выражение больше или 1 раз.

Edited by Zverushka
Link to comment
Share on other sites

  • 0

Уже вижу корень проблемы. Не получается внутри квадратных скобок, которые и означают любую последоательность задать элементу квантификатор...

http://regex101.com/#javascript Вот здесь можно потестить. Что же делать???

Link to comment
Share on other sites

  • 0

Регулярка для валидации пишется или для разбора/парсинга строки?

И пару примеров строк валидных и невалидных не помешает для внесения ясности как в итоге должна выглядеть регулярка.

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

Случайно не для телефонных номеров регулярка пишется?

Link to comment
Share on other sites

  • 0

Да пишу для телефона - чтобы можно было вводить цифру (обязательно) и не обязательно - тире и скобки.

Пишу не для парсинга, чтобы предупреждение об ошибке выдало.

хм... если принципиально - то добивать регулярку. если нет, то может маску?

http://ruseller.com/...s424/index.html

Я честно говоря побаиваюсь, если пользователь нажмет сабмит, не введя до конца цифры - то маска запишется как его данные. То есть надо еще писать скрипт обработки. А у меня уже висит один скрипт для старых браузеров, который value при отправке снимает... Надо их совмещать и тестить, тестить...

Почему это работает? Ведь символы в квадратных скобках, хоть и в любой последовательности, но обязательны же все?

http://regex101.com/r/tE4uL7

Запуталась окончательно...

Edited by Zverushka
Link to comment
Share on other sites

  • 0

хм... а так ?

http://regex101.com/r/lT7uO4

http://regex101.com/r/hO7cT3

Почему это работает? Ведь символы в квадратных скобках, хоть и в любой последовательности, но обязательны же все?

Регулярки никогда не писал, но так понимаю что javascript, сравнивает с тем параметром, что в скобках. не обязательно все, это набор разрешенных

Edited by Николя223
Link to comment
Share on other sites

  • 0

Неплохо.

Пока нащупала вот такой вариант.


^\+?[\d()\-\s]*\d+\s*$

Что означает плюс всегда вначале. Любой из символов скобочки или цифры может встретится, а может нет. Но цифра встретится обязательно и она должна быть последней (и пробелы могут встретиться в конце).

Меня просто задело, почему нельзя составить под элементарно условие: может встречаться что угодно из перечисленных символов, но цифра должна быть всегда.

Link to comment
Share on other sites

  • 0

Вот ещё вариант

http://regex101.com/r/gD8hP3

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

хм.. регулярки оказывается просто...

а вот мануальчик

http://javascript.ru...sic/regular-expression

Edited by Николя223
Link to comment
Share on other sites

  • 0
Я честно говоря побаиваюсь, если пользователь нажмет сабмит, не введя до конца цифры

отключайте кнопку (disabled), если данные невалидны. Пример на ангуляре http://jsfiddle.net/JrDbu/1/

Edited by nerv
Link to comment
Share on other sites

  • 0

Не загоняя пользователя в рамки(не требуя указывать номер в определенном формате) никакая регулярка(просто одна единственная проверка на соответствие регулярному выражению) не будет эффективной.

Структура телефонного номера

— код страны: от 1 до 3 цифр, число определяющее код страны адресата начинающееся с символа +. Для России это «+7″

— код нас. пункта: обычно от 2 до 5 цифр, но иногда может быть и до 8 цифр, код внутри страны для данного населённого пункта. Ещё точнее код для данной телефонной станции.

— номер телефона: 7-ти,6-ти или 5-х значный номер, как правило разделённый в форматах <3 цифры>-<2 цифры>-<2 цифры> или <2 цифры>-<2 цифры>-<2 цифры>

Если суметь донести выше изложенное пользователю в доступной форме, тогда простую проверку можно делать этой регуляркой:


^\D*(\+\d{1,3})?\D*(\d{2,5})\D*(\d{2,3})\D*(\d{2})\D*(\d{2})\D*$

Но это решение не подойдет если поставлена задача ЖЕСТКО отсекать неправильные номера телефонов. В таком случае проверка должна выполняться серверной стороной и быть довольно сложной.

Link to comment
Share on other sites

  • 0
Эта строка приведенной регуляркой считается валидной "+3333333333333333333333333333333333333333333"

так то можно просто ограничение на длину содержимого input поставить ;)

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

Это легче чем вы думаете :)

Edited by Николя223
Link to comment
Share on other sites

  • 0
Это легче чем вы думаете

Все зависит от  контекста. Если просто хочется поиграться с регулярками, то да. А если поставлена реальная задача в рамках рабочего проекта, - то это совершенно иной случай.

 

так то можно просто ограничение на длину содержимого input поставить

В рамках рабочего проекта на валидацию данных на клиенте никогда нельзя опираться! Клиентскую валидацию можно рассматривать исключительно как дополнение или опцию. Валидация всегда должна выполняться на сервере независимо от того, что происходит на клиенте.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy