Вместо того чтобы писать одно большое регулярное выражение, было бы яснее писать отдельные регулярные выражения для проверки каждого из ваших желаемых условий.
Тест содержит ли имя пользователя только буквы, цифры, символы 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 - в категории «отметка».
Юникод волосатый, и ограничение символов в именах пользователей не обязательно является хорошей идеей в любом случае. Вы уверены, что хотите это сделать?
И «1 за раз» означает «1 в строке»? Или «1 в каждом имени пользователя»? –
«greek, russian» убедитесь, что ваше приложение, DB и кодировка соединения - utf-8, иначе вы потеряете некоторые символы в середине процесса. – gertas