Регулярное выражение для буквенно-цифровых символов и подчеркивания


585

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

regex 

9
Жаль, что разные движки регулярных выражений имеют разные средства для сопоставления буквенно-цифровых символов. Подобный вопрос (довольно расплывчатый, без указания языка / регулярного выражения) требует очень длинного или, по крайней мере, очень организованного ответа, касающегося каждого варианта.
Wiktor Stribi'ew

Ответы:


939

Чтобы сопоставить строку, содержащую только эти символы (или пустую строку), попробуйте

"^[a-zA-Z0-9_]*$"

Это работает для регулярных выражений .NET и, возможно, для многих других языков.

Разбивая это:

^ : start of string
[ : beginning of character group
a-z : any lowercase letter
A-Z : any uppercase letter
0-9 : any digit
_ : underscore
] : end of character group
* : zero or more of the given characters
$ : end of string

Если вы не хотите разрешать пустые строки, используйте + вместо *.


Как уже отмечали другие, некоторые языки регулярных выражений имеют сокращенную форму для [a-zA-Z0-9_]. В языке регулярных выражений .NET вы можете включить поведение ECMAScript и использовать его \wкак сокращение (уступая ^\w*$или ^\w+$). Обратите внимание, что в других языках, и по умолчанию в .NET, \wон несколько шире и будет соответствовать другим видам символов Юникода (спасибо Яну за указание на это). Поэтому, если вы действительно хотите сопоставить только эти символы, лучше использовать явную (более длинную) форму.


8
Если вы когда-нибудь поедете в Германию или когда-нибудь увидите какой-нибудь немецкий текст, вы поймете, что я говорю.
Windows программист

30
\ w и [A-Za-z0-9_] не эквивалентны в большинстве разновидностей регулярных выражений. \ w включает в себя буквы с диакритическими знаками, письма из других сценариев и т. д.
Ян Гойваертс

4
В первоначальном вопросе говорилось «прописные и строчные буквы», поэтому казалось бы, что «буквы» из нелатинских алфавитов должны совпадать.
Трейказ

3
[\p{upper}\p{lower}\p{gc=Number}_]это все, что вам нужно, чтобы сделать это правильно, при условии, что нет комбинирующих символов.
tchrist

1
Похоже, что preg_match требует, чтобы ваш шаблон был заключен в разделители, которые обычно являются косыми чертами. Поэтому вам понадобится "/ ^ [a-zA-Z0-9 _] * $ /". См. Этот вопрос для получения дополнительной информации: stackoverflow.com/questions/6445133/… . Смотрите также эту страницу: forums.phpfreaks.com/topic/…
Чарли

346

Здесь много многословия, и я категорически против, поэтому мой окончательный ответ:

/^\w+$/

\wэквивалентно [A-Za-z0-9_], что в значительной степени то, что вы хотите. (если мы не введем юникод в микс)

Используя +квантификатор, вы сопоставите один или несколько символов. Если вы также хотите принять пустую строку, используйте *вместо этого.


67
\wобычно не ограничивается только ASCII.
tchrist

26
Английский не единственный язык в мире, поэтому это должен быть принятый ответ, а не [a-z]его варианты. \wбудет захватывать нелатинские символы тоже. Нравится šēēāиликукареку
Alex

1
Утверждено на странице 318 О'Рейли "Освоение регулярных выражений"
guidotex

36

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

[A-Za-z0-9_]

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

\w

Что эквивалентно (в некоторых разновидностях регулярных выражений, поэтому обязательно проверьте, прежде чем использовать его). Затем, чтобы указать, что вся строка должна совпадать, вы используете:

^

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

$

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

\w+ or \w*

Для обозначения «1 или более» или «0 или более». Собрав все это вместе, мы имеем:

^\w*$

10
\ w и [A-Za-z0-9_] не эквивалентны в большинстве разновидностей регулярных выражений. \ w включает в себя буквы с диакритическими знаками, письма из других сценариев и т. д.
Ян Гойваертс

32

Гм ... вопрос: нужно ли хотя бы один символ или нет? Это может быть пустая строка?

^[A-Za-z0-9_]+$

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

^[A-Za-z0-9_]*$

Редактировать:

Если необходимо включить диакритические знаки (например, cedilla - ç), вам необходимо использовать символ слова, который соответствует описанному выше, но содержит диакритические знаки:

^\w+$

Или

^\w*$

Ну, теперь, когда вы упомянули об этом, я также пропустил целый ряд других французских персонажей ...
BenAlabaster

1
\ w такой же, как [\ w] с меньшими усилиями при наборе текста
Ян Гойваертс

Да, вам все еще нужны + или *, а ^ и $ - \ w просто проверяет, что они содержат символы слова, а не только слова ...
BenAlabaster

странно, это все еще позволяет знак $.
Induster

@Induster, это из-за того, на что только что указал BenAlabaster
Себас

27

Хотя это более многословно \w, я лично ценю удобочитаемость полных имен классов символов POSIX ( http://www.zytrax.com/tech/web/regex.htm#special ), поэтому я бы сказал:

^[[:alnum:]_]+$

Однако, хотя в документации по ссылкам выше указано, что « \wбудет соответствовать любой символ в диапазоне 0–9, A - Z и a - z (эквивалент POSIX [: alnum:])», я не нашел, что это правда , Во grep -Pвсяком случае, не с . Вы должны явно включить подчеркивание, если вы используете, [:alnum:]но не если вы используете \w. Вы не можете победить следующее коротко и сладко:

^\w+$

Наряду с удобочитаемостью, использование классов символов POSIX ( http://www.regular-expressions.info/posixbrackets.html ) означает, что ваше регулярное выражение может работать со строками, не относящимися к ASCII, а регулярные выражения на основе диапазона не будут работать, поскольку они полагаются на регулярные выражения. базовый порядок символов ASCII, который может отличаться от других наборов символов и поэтому будет исключать некоторые не-ASCII символы (буквы, такие как œ), которые вы, возможно, захотите захватить.


22

В информатике буквенно-цифровое значение часто означает, что первый символ не является числом, а представляет собой алфавит или подчеркивание. После этого персонаж может быть 0-9, A-Z, a-zили подчеркивание ( _).

Вот как вы это сделаете:

Протестировано под php:

$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'

или возьми это

^[A-Za-z_][A-Za-z\d_]*$

и поместите его на свой язык разработки.


17

Как насчет:

^([A-Za-z]|[0-9]|_)+$

... если вы хотите быть явным, или:

^\w+$

... если вы предпочитаете сжатый (синтаксис Perl).


12

используйте Lookaheads, чтобы сделать «хотя бы один» материал. Поверь мне, это намного проще.

Вот пример, который потребовал бы 1-10 символов, содержащих по крайней мере одну цифру и одну букву:

^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$

ПРИМЕЧАНИЕ: мог бы использовать \ w, но тогда вступают в силу соображения ECMA / Unicode, увеличивающие охват символов \ w «символ слова».


Как бы мы поступили, если хотим добавить _ и - в список?
Рахи

10

Попробуйте эти многоязычные расширения, которые я сделал для строки.

IsAlphaNumeric - строка должна содержать по крайней мере 1 альфа (буква в диапазоне Unicode, указанная в charSet) и по крайней мере 1 номер (указанная в numSet). Также строка должна содержать только буквы и цифры.

IsAlpha - строка должна содержать как минимум 1 альфа (на указанном языке charSet) и содержать только альфа.

IsNumeric - строка должна содержать как минимум 1 число (на указанном языке numSet) и содержать только цифры.

Диапазон charSet / numSet для желаемого языка может быть указан. Диапазоны Unicode доступны по ссылке ниже:

http://www.ssec.wisc.edu/~tomw/java/unicode.html

API:

    public static bool IsAlphaNumeric(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";
        const string numSet = @"0-9";

        //Greek
        //const string charSet = @"\u0388-\u03EF";            
        //const string numSet = @"0-9";

        //Bengali
        //const string charSet = @"\u0985-\u09E3";
        //const string numSet = @"\u09E6-\u09EF";

        //Hindi
        //const string charSet = @"\u0905-\u0963";
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^(?=[" + numSet + @"]*?[" + charSet + @"]+)(?=[" + charSet + @"]*?[" + numSet + @"]+)[" + charSet + numSet +@"]+$").Success;
    }

    public static bool IsNumeric(this string stringToTest)
    {
        //English
        const string numSet = @"0-9";

        //Hindi
        //const string numSet = @"\u0966-\u096F";

        return Regex.Match(stringToTest, @"^[" + numSet + @"]+$").Success;
    }

    public static bool IsAlpha(this string stringToTest)
    {
        //English
        const string charSet = "a-zA-Z";

        return Regex.Match(stringToTest, @"^[" + charSet + @"]+$").Success;
    }

Применение :

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();

@Shah: я добавил только алфавиты (и только цифры тоже).
Шантану

8

Следующее регулярное выражение соответствует буквенно-цифровым символам и подчеркиванию:

^[a-zA-Z0-9_]+$

Например, в Perl:

#!/usr/bin/perl -w

my $arg1 = $ARGV[0];

# check that the string contains *only* one or more alphanumeric chars or underscores
if ($arg1 !~ /^[a-zA-Z0-9_]+$/) {
  print "Failed.\n";
} else {
    print "Success.\n";
}

Шаблон в вашем коде правильный, но шаблон выше проверяет только один экземпляр.
BenAlabaster

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

1
@Windows programmer - en.wikipedia.org/wiki/Alphanumeric - латинский алфавит , а не «латинский набор символов», который включает в себя диакритические знаки и т. Д. Чисто проблема семантики, но я лично согласен с распространенным использованием термина алфавитно-цифровой как AZ и 0-9.
Джей

2
- буква алфавита на испанском языке, в том числе в Латинской Америке.
Windows программист

2
«Я хотел бы иметь регулярное выражение, которое проверяет, содержит ли строка только прописные и строчные буквы, цифры и подчеркивания», не ограничивает его латинскими буквами. «Следующее регулярное выражение соответствует буквенно-цифровым символам и подчеркиванию» не ограничивает его латинскими буквами. «^ [a-zA-Z0-9 _] + $» завершается ошибкой.
программист Windows

6

Это должно работать в большинстве случаев.

/^[\d]*[a-z_][a-z\d_]*$/gi

И под большинством я имею в виду,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


объяснение

  1. ^ ... $ - сопоставить шаблон, начинающийся и заканчивающийся
  2. [\d]* - соответствовать нулю или более цифр
  3. [a-z_] - соответствовать алфавиту или подчеркиванию
  4. [a-z\d_]* - соответствовать алфавиту или цифре или подчеркиванию
  5. /gi - сопоставлять глобально через строку и без учета регистра

2
В первоначальном вопросе не было требования, чтобы письмо присутствовало.
Дмитрий Кузьминов

О каком письме ты говоришь? Мое регулярное выражение содержит тот, который задан в вопросе. Алфавиты, цифры, подчеркивание
Чинмая Пати

1234это слово из языка , запрошенного автором. Ваш язык более строгий.
Дмитрий Кузьминов

4

Для меня возникла проблема, заключающаяся в том, что я хочу провести различие между буквенно-цифровым и буквенно-цифровым, поэтому для обеспечения того, чтобы буквенно-цифровая строка содержала хотя бы одну букву и хотя бы одну цифру, я использовал:

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

Именно то, что я хочу ... Спасибо
Аникет Кале

3

Вот регулярное выражение для того, что вы хотите с квантификатором, чтобы указать не менее 1 символа и не более 255 символов

[^a-zA-Z0-9 _]{1,255}

2

Для тех из вас, кто ищет буквенно-цифровые соответствия в юникоде, вы можете сделать что-то вроде:

^[\p{L} \p{Nd}_]+$

Дополнительная информация на http://unicode.org/reports/tr18/ и на http://www.regular-expressions.info/unicode.html.


Если вы просто хотите, чтобы латынь делала p {Latin} вместо p {L}
Агустин

2

Я полагаю, что вы не принимаете символы латиницы и Юникода в своих матчах. Например, если вам нужно использовать символы «ã» или «ü», использование «\ w» не сработает.

Вы также можете использовать этот подход:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

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



1

^\w*$ будет работать для следующих комбинаций

1
123
1av
pRo
av1

Как насчет пустой строки. Это также буквенно-цифровая строка?
v010дя


0

Это работает для меня, нашел это в "Освоение регулярных выражений" О'Рейли:

/^\w+$/

Объяснение:

  • ^ устанавливает позицию в начале строки
    • \ w + соответствует любому символу слова (равен [a-zA-Z0-9_])
    • «+» Quantifier - Сопоставляет от одного до неограниченного количества раз, столько раз, сколько возможно, возвращая при необходимости (жадный)
  • $ устанавливает позицию в конце строки

Проверьте себя:

const regex = /^\w+$/;
const str = `nut_cracker_12`;
let m;

if ((m = regex.exec(str)) !== null) {
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.