Регулярное выражение имени пользователя Yahoo

Мне нужно регулярное выражение (php) для соответствия правилам имени пользователя Yahoo:

Use 4 to 32 characters and start with a letter. You may use letters, numbers, underscores, and one dot (.).

Какой тип регулярного выражения будет делать это? Какой инструмент? Если это не движок PCRE (используемый в Python и Ruby), различные инструменты имеют различный синтаксис регулярных выражений.

Axeman 04.10.2008 01:57

php, как я уже сказал. хотя я мог бы улучшить его до php 4. что-то

magicrobotmonkey 06.10.2008 19:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
9
2
6 248
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ограничение в одну точку? Это сложно.

Я не эксперт по регулярным выражениям, но я думаю, что это получится, за исключением этого:

[A-Za-z][A-Za-z0-9_.]{3,31}

Может быть, вы могли бы проверить наличие. требование отдельно?

Для этого требуются анкеры ^ и $, чтобы обеспечить соблюдение требований к длине.

ridgerunner 24.07.2011 05:13

Как бы вы изменили это значение для одного подчеркивания, сохранив все остальные ограничения?

Joel 18.03.2013 21:08

@Joel так же, как я сделал для одной точки: применяйте ее отдельно от выражения.

Joel Coehoorn 18.03.2013 21:12

/[a-zA-Z][a-zA-Z0-9_]*\.?[a-zA-Z0-9_]*/

И проверьте, если strlen ($ username)> = 4 и <= 32.

Теперь, если бы мы могли найти способ их комбинировать, просто он ДОЛЖЕН соответствовать обоим.

Joel Coehoorn 04.10.2008 01:37

Да уж. Однако strlen - довольно быстрая операция.

Randy 04.10.2008 01:44

но у меня нет возможности использовать strlen, в том месте, где я нахожусь, одно регулярное выражение - это все, что я получаю.

magicrobotmonkey 04.10.2008 01:48

Что мешает вам добавить строку после регулярного выражения?

Randy 04.10.2008 02:05

многое могло. Например, в ASP.Net вы можете использовать элемент управления RegExValidator. Или у него может быть строка в файле конфигурации, которую он может установить, и все.

Joel Coehoorn 04.10.2008 17:30

да, это в значительной степени последнее. Я стараюсь, чтобы мой класс был чистым и чистым.

magicrobotmonkey 05.10.2008 22:20

Если вы хотите сохранить его в одной строке в одном месте, вы всегда можете превратить это в функцию checkusername () и выполнить там две проверки. Попытка сохранить классы чистыми звучит так, как будто это оставит вас с неподдерживаемым кодом, если вы постоянно пытаетесь найти способы объединить строки.

Randy 06.10.2008 19:22

Используя опережения, вы можете сделать следующее:

^(?=[A-Za-z](?:\w*(?:\.\w*)?$))(\S{4,32})$

Поскольку вы не указали, какой тип регулярного выражения вам нужен, я добавил много вещей, совместимых с Perl 5. Как (?: ... ) для не захватывающих паренов.

Примечание: Я снова добавил недостающий закрывающий элемент.

У этого отсутствует закрывающий парен, и как только я добавлю его (попробовал пару мест ...), я не могу заставить его соответствовать ни одной строке, которую я на него набрасываю.

magicrobotmonkey 06.10.2008 19:40
Ответ принят как подходящий

/^[A-Za-z](?=[A-Za-z0-9_.]{3,31}$)[a-zA-Z0-9_]*\.?[a-zA-Z0-9_]*$/

Или чуть короче:

/^[a-z](?=[\w.]{3,31}$)\w*\.?\w*$/i

Хорошо, прочитав об обходных методах, теперь я понял, это довольно больной человек, спасибо

magicrobotmonkey 06.10.2008 20:51

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

CyberJunkie 24.07.2011 03:17

Первый - это /^[A-Za-z](?=[A-Za-z0-9_\.]{3,31}$)[a-zA-Z0-9_]*\.?[a-zA-Z0-‌​9_]*$/ (ваш не избежал точки в предварительном просмотре). Я думаю, что неэкранированный период делает остальную часть [A-Za-z0-9_] бессмысленной. ОДНАКО, что интересно, я думаю, что он все еще работает, потому что он находится в предварительном просмотре, что означает, что следующие [a-zA-Z0-9_] также должны быть сопоставлены, эффективно исправляя неэкранированный .. Но также возможно, я думаю, просто сделать этот /^[A-Za-z](?=.{3,31}$)[a-zA-Z0-9_]*\.?[a-zA-Z0-9_]*$/, хотя я хотел оригинал с \. лучше всего. Я все еще новичок в REGEX, это правильно?

jmk2142 11.06.2012 09:23

Внутри [] вам не нужно выходить из .. Это будет соответствовать только точке.

Markus Jarderot 11.06.2012 12:56

Другие вопросы по теме