Регулярное выражение для имени пользователя - PullRequest
5 голосов
/ 17 мая 2010

Мне нужна помощь по регулярному выражению при условии (4) ниже:

  1. Начните с a-z
  2. Конец a-z0-9
  3. разрешить 3 специальных символа, таких как ._-
  4. Символы в (3) должны сопровождаться буквенно-цифровыми символами, и после них не должно быть никаких символов в (3).

Не уверен, как это сделать. Любая помощь приветствуется, с образцом и некоторыми объяснениями.

Ответы [ 4 ]

9 голосов
/ 17 мая 2010

Вы можете попробовать это:

^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$

При этом используются подсказки, чтобы имя пользователя должно содержать от 5 до 10 символов (?=.{5,10}$) и чтобы ни один из 3 специальных символов не появлялся дважды подряд (?!.*[._-]{2}), но в целом они могут появляться любое количество раз (интерпретирует Конрад Иными словами, 3 специальных символа могут появляться до 3 раз).

Вот тестовый набор в Java:

    String[] test = {
        "abc",
        "abcde",
        "acd_e",
        "_abcd",
        "abcd_",
        "a__bc",
        "a_.bc",
        "a_b.c-d",
        "a_b_c_d_e",
        "this-is-too-long",
    };
    for (String s : test) {
        System.out.format("%s %B %n", s,
            s.matches("^(?=.{5,10}$)(?!.*[._-]{2})[a-z][a-z0-9._-]*[a-z0-9]$")
        );
    }

Это печатает:

abc FALSE 
abcde TRUE 
acd_e TRUE 
_abcd FALSE 
abcd_ FALSE 
a__bc FALSE 
a_.bc FALSE 
a_b.c-d TRUE 
a_b_c_d_e TRUE 
this-is-too-long FALSE 

Смотри также

7 голосов
/ 17 мая 2010

Итак, в основном:

  1. Начните с [a-z].
  2. Разрешите первую порцию [a-z0-9] несколько раз. 1)
  3. Разрешить
    • не более одного из [._-], затем
    • по меньшей мере одного из [a-z0-9]
    • три раза или меньше.
  4. Конец [a-z0-9] (подразумевается в приведенном выше).

Что дает:

^[a-z][a-z0-9]*([._-][a-z0-9]+){0,3}$

Но учтите, что это может привести к тому, что имена пользователей будут содержать только один символ.


1) (отправлено @codeka)

5 голосов
/ 17 мая 2010

попробуйте это:

^[a-zA-Z](([\._\-][a-zA-Z0-9])|[a-zA-Z0-9])*[a-z0-9]$

1) ^ [a-zA-Z]: начало

2) (([._-] [a-zA-Z0-9]) | [a-zA-Z0-9]) *: любое количество букв или специальных символов, за которыми следует алфавит

3) [a-z0-9] $

1 голос
/ 17 мая 2010

Ну, потому что я чувствую себя ... мной. Одному Регексу не нужно управлять ими всеми, а для одного из Девяти см. nqueens . (Однако в этом случае уже есть несколько хороших ответов; я просто указываю на несколько иной подход.)

function valid(n) {
  return (n.length > 3
    && n.match(/^[a-z]/i)
    && n.match(/[a-z0-9]$/i)
    && !n.match(/[._-]{2}/)
}

Теперь представьте, что вы разрешаете только один., _ Или - всего (возможно, я неправильно понял начальные требования пожимаю плечами ); это легко добавить (и визуализировать):

&& n.replace(/[^._-]/g, "").length <= 1

И прежде чем кто-нибудь скажет "это менее эффективно", зайдите в профиль по назначению. Также обратите внимание, что я не отказался от использования регулярных выражений полностью, они замечательные вещи.

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