Пользователь
0,0
рейтинг
11 июля 2011 в 11:33

Разработка → Регулярные выражения для валидации распространенных видов данных

Для проверки текстовых полей на валидность обычно используют регулярные выражения. Существует несколько наиболе распространенных видов таких даных, как например номер кредитки, дата в определенном формате и т. д. На сайте html5pattern.com собирается коллекция регулярных выражений для таких данных (там это позиционируется, как возможное содержимое html5-атрибута pattern у inpit-элементов, но эти регулярные выражения можно использовать и для привычной валидации с помощью javascript). Актуальные для российской аудитории примеры, вместе с соответствующими регулярными выражениями вы можете посмотреть под катом.
  • Номер кредитки:
    [0-9]{13,16}
  • ICQ:
    ([1-9])+(?:-?\d){4,}
  • Набор из букв и цифр (латиница):
    ^[a-zA-Z0-9]+$
  • Набор из букв и цифр (латиница + кириллица):
    ^[а-яА-ЯёЁa-zA-Z0-9]+$
  • Домен (например abcd.com):
    ^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$
  • IPv4: (подкорректировано runcore)
    ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
  • IPv6:
    ((^|:)([0-9a-fA-F]{0,4})){1,8}$
  • Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, первый символ обязательно буква):
    ^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$
  • Пароль (Строчные и прописные латинские буквы, цифры):
    ^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*\s).*$
  • Пароль (Строчные и прописные латинские буквы, цифры, спецсимволы. Минимум 8 символов):
    (?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$
  • Дата в формате YYYY-MM-DD:
    [0-9]{4}-(0[1-9]|1[012])-(0[1-9]|1[0-9]|2[0-9]|3[01])
    UPD. Более строгая проверка, предложенная runcore:
    (19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)
  • Дата в формате DD/MM/YYYY:
    (0[1-9]|[12][0-9]|3[01])[- /.](0[1-9]|1[012])[- /.](19|20)\d\d
  • Целые числа и числа с плавающей точкой (разделитель точка):
    \-?\d+(\.\d{0,})?
  • UUID:
    ^[0-9A-Fa-f]{8}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{4}\-[0-9A-Fa-f]{12}$
  • Широта или долгота:
    -?\d{1,3}\.\d+

  • UPD. E-mail (от kvf77):
    ^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$
  • UPD. URL на латинице. Если нужно распознавать и кириллические домены, необходимо изменить все «a-z0-9» на «а-яёa-z0-9» и добавить в список доменных зон «рф» (от kvf77):
    ~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:ru|su|com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&?+=\~/-]*)?(?:#[^ '\"&]*)?$~i
  • UPD. Время в формате HH:MM:SS (от runcore):
    ^([0-1]\d|2[0-3])(:[0-5]\d){2}$
  • UPD. Mac-адрес (от tiahin):
    ([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}

Неуказанные, но важные на ваш взгляд типы данных, можете выкладывать в комментариях (вместе с регулярными выражениями). Можете так же поделиться ими с html5pattern.com, заполнив форму на главной странице.
Константин @xostik
карма
70,2
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (64)

  • 0
    «Целые числа и числа с плавающей точкой» и «Целые числа и с плавающей точкой» — одинаковы, может одно из них удалить?
    • 0
      О, точно. спасибо!
  • +1
    | Набор из букв и цифр (латиница + кириллица):
    | ^[а-яА-Яa-zA-Z0-9]+$

    Не верный шаблон т.к. не проглотит букву Ё:

    pattern = /^[а-яА-Яa-zA-Z0-9]+$/;
    str = 'прёт';
    console.log(pattern.test(str));
    • 0
      Ага, так и есть, благодарю. ^[а-яА-ЯёЁa-zA-Z0-9]+$ — так ведь нормально?
  • –1
    Некоторые регулярки слабоваты — слишком тупо валидируют
    Емаил: /^[-\w.]+@([A-z0-9][-A-z0-9]+\.)+[A-z]{2,4}$/
    URL: ~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}". "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|". «org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?». "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&". "?+=\~/-]*)?(?:#[^ '\"&]*)?$~i
    • +31
      Вообще то E-mail немного больше судя по RFC822

      (?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
      )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
      \r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
      ?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[
      \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
      31]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\
      ](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+
      (?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:
      (?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
      |(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)
      ?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\
      r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[
      \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)
      ?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t]
      )*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[
      \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*
      )(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
      )+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)
      *:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+
      |\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r
      \n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:
      \r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t
      ]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031
      ]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](
      ?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?
      :(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?
      :\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)|(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?
      :(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?
      [ \t]))*"(?:(?:\r\n)?[ \t])*)*:(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\]
      \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|
      \\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>
      @,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"
      (?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t]
      )*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
      ".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?
      :[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[
      \]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:[^()<>@,;:\\".\[\] \000-
      \031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(
      ?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)?[ \t])*(?:@(?:[^()<>@,;
      :\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([
      ^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\"
      .\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\
      ]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\
      [\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\
      r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\]
      \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]
      |\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?(?:[^()<>@,;:\\".\[\] \0
      00-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\
      .|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,
      ;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?
      :[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*
      (?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
      \[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[
      ^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]
      ]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(?:\r\n)?[ \t])*)(?:,\s*(
      ?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
      ".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(
      ?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[
      \["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t
      ])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t
      ])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?
      :\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|
      \Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*|(?:
      [^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\
      ]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)*\<(?:(?:\r\n)
      ?[ \t])*(?:@(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["
      ()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)
      ?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>
      @,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*(?:,@(?:(?:\r\n)?[
      \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,
      ;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t]
      )*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\
      ".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*)*:(?:(?:\r\n)?[ \t])*)?
      (?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".
      \[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])*)(?:\.(?:(?:
      \r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z|(?=[\[
      "()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:\r\n)?[ \t])
      *))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
      +|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
      .(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
      |(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
      ?:\r\n)?[ \t])*))*)?;\s*)
      • +29
        я очень надеялся, что хоть один пост про регулярки будет без этой портянки.
        • –6
          Долг зовёт
      • +1
        > Вообще то E-mail немного больше судя по RFC822

        Почему вы ссылаетесь на устаревший RFC?
        Его ещё в 2001 году заменил RFC 2822
    • +2
      Email не проходит c символом +. Это довольно важная нотация, незаслуженно обходимая вниманием (можно тэги ставить или фильтры настраивать в гуглопочте, яндексе и т.п.)
  • –1
    URL че-то побился

    ~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|org|mil|edu|arpa|gov|biz|info|aero|inc|name|[a-z]{2})|(?!0)(?:(?!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&?+=\~/-]*)?(?:#[^ '\"&]*)?$~i
    • +5
      А где ".рф"?
    • 0
      спасибо, добавил ваши варианты. В доменные зоны добавил ru и su
    • +4
      У вас кучи зон не хватает (и в будущем их будет ещё больше, будете апдейтить регулярку во всех своих проектах?).
  • +16
    А толку то в валидации регулярными выражениями? Они дадут только некоторое подобие правильности введённых данных.

    Номер кредитки:
    [0-9]{13,16}

    Во первых, не любой номер является кредиткой, во вторых, если проверять ввод, то мне вот удобнее было бы вводить со "-", как на самой кредитке написано. Или с пробелами.

    Даты в формате позволяют вводить 31 февраля и тому подобные не даты.
    IPv4 можно вводить числом.

    Если мне не изменяет память, то в ICQ можно добавлять к номеру какое-то число и будет всё тот-же номер, из-за чего уверенно искались и 15-значные числа.

    Так что:
    Если у программиста есть проблема и он думает — «Я решу ее при помощи регулярных выражений», то с этого момента у программиста уже две проблемы. ©
    • –3
      Да, само собой, использование регулярных выражений в этих случаях не дает сильной защиты от ошибок, но большинство опечаток пользователей она будет отлавливать.
      • +3
        1) Название топика (на текущий момент) «Регулярные выражения для валидации …». Это как-то плохо сочетается с тем, что ошибки оно не отлавливает.

        2) Почти для каждого вида вводимых данных можно сделать редактор, который обеспечит более удобное введение этих данных + правила валидации, которые имеют некоторую чёткую логику, которой часто не хватает в грамматике регулярных выражений.

        Соответственно исправлять очепатки и делать более удобным ввод — задача редактора, а регулярки просто способ чуть чуть спрятать проблему, которая потом аукнется после.
    • 0
      /(19|20)\d\d-((0[1-9]|1[012])-(0[1-9]|[12]\d)|(0[13-9]|1[012])-30|(0[13578]|1[02])-31)/
      

      вот так дата проверяется полностью, кроме учета високосных лет )
      • 0
        вполне рабочая регулярка, которая может быть полезна тем кто изучает Регекспы как пример.
        озвучивайте что непонравилось — подискутируем.
        • 0
          25. Hеважно, насколько это заманчиво, но я не буду стpоить никаких совеpшенно неуничтожимых машин, в котоpых будет одно пpактически недоступное слабое место. © 100 правил Темного Властелина
          • +4
            ну тогда вообще программировать нельзя. ведь как известно «в программе всегда есть еще один баг». хотя подозреваю что к вашим программа это не относится?)
            • 0
              В точку. Все мои программы идеальны, Agda и Coq в помощь. =) Всё-таки должны же быть исключения из правил.

              А если чуть более серьёзно, то баги всё-таки то, что не ожидает разработчик, а если знать где упасть то можно и поставить зомби с носилками соломки постелить.
    • +1
      да, и меня как пользователя сильно раздражает в полях ввода кредитки отсутствие поддержки пробелов, либо ограничение длины номера в поле без учёта пробелов
  • +1
    Регексп на домен не корректен. Необходимо добавить а-Я, ибо например *.рф домены не пройдут.
    • 0
      Не нужно добавлять а-яА-Я (именно так наверное вы имели ввиду)
      Нужно переводить домен в пуникод и затем проверять на валидность
  • +1
    haacked.com/archive/2007/08/21/i-knew-how-to-validate-an-email-address-until-i.aspx — занятная статья про валидацию email
  • +1
    регулярка ip адресов некорректная! — пропускает например такую строку .192.168.0.100
    вот правильный вариант:
    ((25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(25[0-5]|2[0-4]\d|[01]?\d\d?)
    
    • 0
      спасибо, подправил
      • 0
        MAC-адрес:
        ([0-9a-fA-F]{2}([:-]|$)){6}$|([0-9a-fA-F]{4}([.]|$)){3}
        • 0
          Добавил. Спасибо!
  • +23
    Ерунда какая-то. Во-первых, лучше выучить regexp, чем пользоваться чем-то, чего не понимаешь. Во-вторых, в номерах кредиток часто ставят пробелы, в ICQ — минусы, в домены бывают локализованные (хоть на арабском), маска IPv6 допускает сколько угодно двоеточий подряд и так далее.
    • –1
      Лучше создать свой велосипед, чем ездить на чужом.
      Логика из этой серии.

      Конечно лучше выучить регулярные выражения, все языки и т.п., но использование чужого кода сэкономит массу времени.
      Ваш Ко.
      • +4
        Ну давайте ещё постить «как проверить переменную на true» или «как сделать цикл от одного до десяти».
        • 0
          Демагогия. Регулярки достаточно сложны, хотя применимость их в основном упирается в задачи валидации.
          Причем многие из этих задач стандартны, что демонстрирует этот топик.

          Целому ряду программистов, этого топика вполне хватит, на всю программистскую жизнь. Далеко не все становятся гуру.

          Нет ничего плохого в том чтобы использовать Смарти, вместо того чтобы писать свой шаблонизатор, точно так же как нет ничего плохого в том, чтобы использовать чужую регулярку вместо написания своей.
          • 0
            Используемые в топике регулярки очень простые. И нет ничего плохо в том, чтобы использовать регулярку, если понимаешь что ты делаешь.
      • 0
        использование чужого кода без понимания черевато велосипедами поверх велосипедов.
        использование регулярки, без понимания ее логики, приводит к фразам типа
        Если у программиста есть проблема и он думает — «Я решу ее при помощи регулярных выражений», то с этого момента у программиста уже две проблемы. ©

        А человек который легко поймет тут приведенные регулярки не будет использовать чужие — ему проще написать свою на этом уровне. Тем более что по крайней мере большинство приведенных регулярок не решают заявленную задачу.

  • +14
    Пароль (Строчные и прописные латинские буквы, цифры):

    Расстрелял бы… Пароль должен быть от 0х00 до 0хFF без исключений, как его набирать и запоминать дело пользователя.
    • +12
      пароль должен быть от \u0000 до \uFFFF
  • +1
    время HH:MM:SS
    ^([0-1]\d|2[0-3])(:[0-5]\d){2}$
    
  • +17
    В общем, минусую пост, он очень вредный. Валидировать данные такими недоделанными регулярками не нужно.
    • 0
      зато пост поднимает интересный вопрос:
      — Какие задачи лучше решать именно регулярками — а какие стоит переложить на плечи других технологий?
      • +1
        Кажется, не очень-то он его поднимает. Скорее он пытается представить, что указанные задачи нужно решать регулярками.
  • +3
    Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, но первый символ обязательно буква):
    ((^|:)([0-9a-fA-F]{0,4})){1,8}$

    да ладна? х)
    • 0
      да, тоже заметил, просто, видимо, автор случайно скопировал предыдущую РЕ'шку
      Ваш Кэп
      • 0
        Так и есть. Исправил.
  • +3
    Я недавно писал упрощенный регекпс на урл, у меня получилось слегка посложнее, чем у вас:
    var urlRegex = (function(){
        var alpha         = 'a-z',
            // scheme     = '['+alpha+'][-+.'+alpha+'\\d]*',
            alnum         = alpha + '\\d',
            hex           = 'a-f\\d',
            unreserved    = '-_.!~*\'()' + alnum,
            reserved      = ';/?:@&=+$,\\[\\]',
            escaped       = '%['+hex+']{2}',
            uric          = '(?:['+unreserved+reserved+']|'+escaped+')',
            userinfo      = '(?:['+unreserved+';:&=+$,]|'+escaped+')*',
            domlabel      = '(?:['+alnum+'](?:[-'+alnum+']*['+alnum+'])?)',
            toplabel      = '(?:['+alpha+'](?:[-'+alnum+']*['+alnum+'])?)',
            ipv4addr      = '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}',
            hex4          = '['+hex+']{1,4}',
            lastpart      = '(?:'+hex4+'|'+ipv4addr+')',
            hexseq1       = '(?:'+hex4+':)*'+hex4,
            hexseq2       = '(?:'+hex4+':)*'+lastpart,
            ipv6addr      = '(?:'+hexseq2+'|(?:'+hexseq1+')?::(?:'+hexseq2+')?)',
            ipv6ref       = '\\['+ipv6addr+'\\]',
            hostname      = '(?:'+domlabel+'\\.)*'+toplabel+'\\.?',
            host          = '(?:'+hostname+'|'+ipv4addr+'|'+ipv6ref+')',
            reg_name      = '(?:['+unreserved+'$,;:@&=+]|'+escaped+')+',
            pchar         = '(?:['+unreserved+':@&=+$,]|'+escaped+')',
            param         = pchar+'*',
            segment       = pchar+'*(?:;'+param+')*',
            path_segments = segment+'(?:/'+segment+')*',
            path          = '/'+path_segments,
            query         = uric+'*',
            fragment      = query,
            port          = '\\:\\d+',
            authority     = '(?:'+userinfo + '@)?' + host + '(?:'+port+')?';
            
        function makeSchemes(schemes){
          return '(?:'+schemes.join('|')+')://';
        }
          
        var defaultSchemes = '(?:' + makeSchemes(['http', 'https']) + '|//)';
        
        return function(schemes){
          var scheme = schemes && schemes.length ? makeSchemes(schemes) : defaultSchemes,
          regexStr = '^' + scheme + authority + '(?:'+path+')?' + '(?:\\?'+query+')?' + '(?:#'+fragment+')?$';
          return new RegExp(regexStr, 'i');
        };
      })();
    


    Попробовать можно будет в следующем релизе underscore.string.
    • 0
      //ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js — подобные урлы тоже, вобщем-то в большинстве случаев корректны. Ваш регексп их не поймет.
      • 0
        Блин, это было послание автору статьи, а не себе.
  • +1
    Добавьте зону museum в валидатор URL.
    • 0
      Ага, и xxx
    • 0
      И .travel
  • 0
    «Имя пользователя (с ограничением 2-20 символов, которыми могут быть буквы и цифры, первый символ обязательно буква):
    ^[a-zA-Z][a-zA-Z0-9-_\.]{1,20}$ „
    тут ограничение не 2-20, а 2-21 символа
    первый символ не посчитали
  • 0
    Доменные зоны лучше стянуть из data.iana.org/TLD/tlds-alpha-by-domain.txt и проверять уже по этому списку. Только не забывайте перед этим переводить домены в IDN-совместимый формат.
  • –2
    E-mail валидировать гораздо сложнее, чем многие думают. Вот приближенный к полному охвату вариантов regexp: ex-parrot.com/~pdw/Mail-RFC822-Address.html
  • 0
    А что мешает использовать \p{L} в режиме юникода, вместо перечисления русских символов?
  • +1
    Описанные регулярки возможно и полезные, но точно не для валидации данных. Они могут использоваться разве для выделения урлов и мейлов в сообщениях, постах и т.п.
  • 0
    В проверке валидности email фигурирует "[A-z0-9]"
    но A-z совсем не то-же самое, что и A-Za-z, т.к. включает в себя следующие символы: [ ] ^ _ ` и \ (откройте charmap)
    Как минимум это не соответствует regex проверки валидности домена, приведённого выше (где эти символы не включены в разрешённый набор), а как максимум это неверно, т.к. адреса вида name@do\main.ru, name@do[main.ru и name@do]main.ru не валидны.

    Я email-ы проверяю такой регуляркой (с ключиком i, поэтому не пишу a-zA-Z):
    ^(?:[-a-z\d\+\*\/\?!{}`~_%&'=^$#]+(?:\.[-a-z\d\+\*\/\?!{}`~_%&'=^$#]+)*)@(?:[-a-z\d_]+\.){1,60}[a-z]{2,6}$

    Ссылку страницу со сравнением результатов проверки разных email этой регулярки и регуляркой по rfc822 (вам уже привели этот 6-КБ regex) я не даю, т.к. опасаюсь хабраэффекта :)

    P.S. валидация домена тоже «крива».
  • 0
    > Дата в формате DD/MM/YYYY

    А где вы такие используете?
    В России принято разделять точками, а у американцев запись со слэшами, но сначала идёт месяц, а только потом число.
  • 0
    > Номер кредитки

    Кстати, всякие номера банковских карт, ИНН, ОГРН, штрих-коды, номера соц.карты, ОКПО, ОКАТО, ISIN, ISSN, ISBN и прочие номера кроме состава символов полезно валидировать на корректность ввода с помощью контрольного числа, которое содержится в самом номере.
  • +1
    За использование по крайней мере некоторых из приведённых регекспов считаю нужным казнить четвертованием (начиная с отрубания рук).
    • +1
      За те, которые не пропускают валидные адреса — точно :)
  • 0
    регулярка ip адреса не совсем верная к примеру прокатывает такое:
    0.1.2.3

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.