2013-06-10 4 views
2

Имея следующее регулярное выражение: ([a-zA-Z0-9//._-]{3,12}[^//._-]) используется как pattern="([a-zA-Z0-9/._-]{3,12}[^/._-])" для проверки ввода HTML текста для имени пользователя, мне интересно, если есть в любом случае рассказывать его, чтобы проверить, что строка имеет только одно из следующих действий: ., -, _Можно ли это сделать с регулярным выражением?

Я имею в виду, что я нуждается в регулярных выражениях, что бы выполнить следующее (если это возможно)

  • alex-how => Действительно
  • alex-how. => Не действует, так как отделка в .
  • alex.how => Действительно
  • alex.how-ha => Не действую, содержит уже .
  • alex-how_da => Не действую, содержит уже -

Проблему с моим текущим регулярным выражением, является то, что для некоторых причина, принимает любой символ в конце строки, которая не ._-, и не может понять, почему.

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

Любые идеи?

ответ

3

Попробуйте один из:

^(?!(.*[.|_|-].*){2})(?!.*[.|_|-]$)[a-zA-Z0-9//._-]{3,12}$ 

Regexpal link. Регулярное выражение выше допускает максимум один из ., _ или -.

+0

отличный ответ, но единственное, чего не хватает (и попробовали добавить его), это то, что он не должен заканчиваться на '-', '_' или' .' – Alex

+0

Там вы идете ... – acdcjunior

0

Точка в регулярном выражении имеет особое значение: «любой символ здесь».

Если вы имеете в виду буквальную точку, вы должны убежать от нее, чтобы рассказать синтаксический анализатор регулярных выражений.

Escape dot in a regex range

+0

Спасибо, но это отвечает только на часть вопроса, а как насчет остальных? – Alex

+0

Я бы сказал, что вы должны добавить все символы в виду в регулярное выражение. – duffymo

+0

Я имел в виду часть, что только одна из '', '_',' .' может содержаться в строке – Alex

1

Надеются, что это будет работать для вас: -

Это говорит начинается с символами с последующими (-, _.), А после и заканчиваются символами

^[\w\d]*[-_\.\w\d]*[\w\d]$ 
+0

тестировал его по адресу http://regexpal.com/ против: 'aab-b-b_a' и не пошел – Alex

+0

@ w0rldart Я обновил регулярное выражение. Пожалуйста, проверьте сейчас. – pvnarula

+0

@ w0rldart regexpal.com не используют начальную и конечную // косую черту.Я обновил без них – pvnarula

1

Что вы want - одна или несколько строк, содержащих все верхние, нижние и цифровые символы , за которыми следует либо один, либо ни один из символов в «-», «.» или «_», за которым следует хотя бы один символ:

^[a-zA-Z0-9]+[-|_|\.]{0,1}[a-zA-Z0-9]+$ 
+0

То же самое, что и для @pvnarula, тесты терпят неудачу на regexpal.com ... но выглядит очень хорошо – Alex

+0

странно. Я использовал regexpal.com для проверки .... Вы проверили флажок «^ $ match at line breaks (m)» перед тем, как вставлять свой вход? Я предполагаю, что вы вставили его на несколько строк ... – Maciej

+0

был моим браузером, по какой-то причине я обновился и хорошо пошел ... осталось только то, что я пытаюсь понять, это допустимая длина '{3 -12} '. Пробовал пару вещей, но ничего ... никакой идеи? – Alex

1

Кажется мне, что вы хотите:

^[A-Za-z0-9]+(?:[\._-][A-Za-z0-9]+)?$ 

разбив его:

  • ^: начало строки
  • [A-Za-z0-9]+: один или несколько буквенно-цифровых символов
  • (?:[\._-][A-Za-z0-9]+)?: (опционально, не захвачен) один из ваших разрешенных специальных символов, за которым следует один или несколько буквенно-цифровых символов
  • $: конец строки

Неясно из вашего вопроса, если вы хотите один из ваших специальных символов (., - и _) быть обязательными или необязательными (например, нулевой или один против точно -один). Если вы действительно хотели, чтобы требовали одного такого специального персонажа, вы бы просто избавились от ? в самом конце.

Вот демонстрация этого регулярного выражения на вашем примере входов:

http://rubular.com/r/SQ4aKTIEF6

Что касается требования длины (от 3 до 12 символов): Это может быть отговоркой, но лично я бы утверждают, что было бы разумнее проверить это, просто проверив свойство length непосредственно в JavaScript, а не чрезмерно усложняя регулярное выражение.

+0

действительно хороший ответ Дэн, очень хорошо объясненный и подробный. Спасибо, я многое узнал от вас всех! – Alex

1
^(?=[a-zA-Z0-9/._-]{3,12}$)[a-zA-Z0-9]+(?:[/._-][a-zA-Z0-9]+)?$ 

или, как регулярное выражение JavaScript буквальное:

/^(?=[a-zA-Z0-9\/._-]{3,12})[a-zA-Z0-9]+(?:[\/._-][a-zA-Z0-9]+)?$/ 
  • упреждающая выборка, (?=[a-zA-Z0-9/._-]{3,12}$), делает проверку на общую длину.
  • Тогда [a-zA-Z0-9]+ гарантирует, что имя начинается с хотя бы одного символа без разделителя.
  • Если есть разделитель, (?:[/._-][a-zA-Z0-9]+)? гарантирует, что за ним следует по крайней мере один не разделитель.

Отметьте, что / не имеет специального значения в регулярном выражении. Вам просто нужно избегать его, если вы используете литерал регулярного выражения (потому что / - это разделитель регулярных выражений), и вы избегаете его путем префикса обратной косой черты, а не другой косой черты. И внутри класса персонажа вам не нужно скрывать точку (.), чтобы она соответствовала буквальной точке.

 Смежные вопросы

  • Нет связанных вопросов^_^