2012-04-24 5 views
1

Я ищу регулярное выражение для проверки имени пользователя.Регулярное выражение для проверки имени пользователя

Имя пользователя, может содержать:

  • Letters (западный, греческий, русский и т.д.)
  • Числа
  • Пространства, но только 1 в то время
  • специальных символов (например: "[email protected]#$%^&*.:;<>?/\|{}[]_+=-"), но только один раз в

РЕДАКТИРОВАТЬ:

Извините за сумбур

  • мне это нужно для какао-ощупь, но я буду иметь, чтобы перевести его на PHP для серверной стороны в любом случае.
  • И с 1 за раз я имею в виду пробелы или специальные символы, которые должны быть разделены буквами или цифрами.
+0

И «1 за раз» означает «1 в строке»? Или «1 в каждом имени пользователя»? –

+0

«greek, russian» убедитесь, что ваше приложение, DB и кодировка соединения - utf-8, иначе вы потеряете некоторые символы в середине процесса. – gertas

ответ

6

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

  • Тест содержит ли имя пользователя только буквы, цифры, символы ASCII ! через @ и пространство: ^(\p{L}|\p{N}|[[email protected]]|)+$. Это должно совпадать, чтобы имя пользователя было действительным. Обратите внимание на использование класса \p{L} для букв Unicode и класса \p{N} для номеров Юникода.

  • Проверьте, содержит ли имя пользователя следующие пробелы: \s\s+. Если это соответствует, имя пользователя недействительно.

  • Протестируйте ли символы последовательно: [[email protected]][[email protected]]+. Если это соответствует, имя пользователя недействительно.

Это удовлетворяет критериям, указанным в тексте.

Однако, в зависимости от того, как написаны имена пользователей, вполне допустимые имена, такие как «Éponine», могут быть отклонены этим подходом. Это потому, что «Э» может быть записана либо в виде U + 00C9 латинских заглавных E с острым (который сочетается с \p{L}) или что-то вроде E с последующим U + 02CA Modifier ПИСЬМО акутом (который является не сопровождаться \p{L}.)

Regular-Expressions.info says it better:

Опять же, "характер" на самом деле означает "Unicode точка кода". \ p {L} соответствует одноточечному коду в категории «письмо». Если ваша строка ввода - , закодированная как U + 0061 U + 0300, она соответствует без акцента. Если вход кодируется как U + 00E0, он соответствует а с акцентом. Причиной является то, что как кодовые точки U + 0061 (a), так и U + 00E0 (à) находятся в категории «буква» , а U + 0300 - в категории «отметка».

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

+0

+1 кому-то придется поддерживать, что – gertas

+0

[! - @] + должен быть [! - @] [! - @] + прав? и \ s + должно быть \ s \ s + справа? и почему «acbde» проверяет, но «нет»? Мне не нужно беспокоиться об именах пользователей, таких как «Éponine», потому что iOS всегда вводит их в виде букв. – Tieme

1

Выражение

^(\w| (?!)|["[email protected]#$%^&*.:;<>?/\|{}\[\]_+=\-")](?!["[email protected]#$%^&*.:;<>?/\|{}\[\]_+=\-")]))*$ 

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

Пожалуйста, спросите себя, почему вы хотите ограничить имена пользователей таким образом. Большую часть времени имена пользователей начинаются с "!!" не должно быть проблемой, и вы раздражаете пользователей, если вы отклоняете их желаемое имя пользователя.

Редактировать:\w не соответствует нелатинским символам. Для этого замените \w на \p{L}, который может работать или не работать в зависимости от реализации регулярного выражения. Regexr, к сожалению, не поддерживает его.

+0

Фактически, в Python, по крайней мере, класс '\ w' зависит от языка. Если ваш язык - русский, то '\ w' соответствует, например, кириллическим символам, и я считаю, что он НЕ соответствует латинским символам. Поэтому даже '\ w' всегда делает то, что вы ожидаете. –

0

Вы хотите что-то вроде

string strUserName = "BillYBob Stev#nS0&"; 
Regex regex = new Regex(@"(?i)\b(\w+\p{P}*\p{S}*\p{Z}*\p{C}*\s?)+\b"); 
Match match = regex.Match(strUserName); 

Если вы хотите, чтобы это объяснить, дайте мне знать.

Надеюсь, это поможет.

Примечание: это регистр нечувствителен.

0

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

String str = "à123 àà@bcà#"; 
String regex = "^([\\p{L}\\d]+[[email protected]#$%\\^&\\*.:;<>\\?/\\|{}\\[\\]_\\+=\\s-]?)+$"; 
Pattern p = Pattern.compile(regex); 
matcher = p.matcher(str); 
if (matcher.find()) 
    System.out.println("Matched: " + matcher.group()); 

Одно предположение я сделал то, что имя пользователя будет начинаться либо с буквы Юникода или номер.

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