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

451

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

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

17 ответов

718

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

"^[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

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

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

  • 6
    Если вы когда-нибудь поедете в Германию или когда-нибудь увидите какой-нибудь немецкий текст, вы поймете, что я говорю.
  • 24
    \ w и [A-Za-z0-9_] не эквивалентны в большинстве разновидностей регулярных выражений. \ w включает в себя буквы с диакритическими знаками, буквы из других сценариев и т. д.
Показать ещё 11 комментариев
231

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

/^\w+$/

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

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

  • 60
    \w обычно не ограничивается только ASCII.
  • 15
    Английский не единственный язык в мире, поэтому это должен быть принятый ответ, а не [az] и его варианты. \w будет также захватывать нелатинские символы. Нравится šēēā или кукареку
Показать ещё 2 комментария
31

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

[A-Za-z0-9_]

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

\w

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

^

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

$

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

\w+ or \w*

Чтобы указать "1 или более", или "0 или более". Соединяя все это, мы имеем:

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

Хотя он более подробный, чем \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-символы (буквы, такие как œ), которые вы можете захотеть захватить.

19

Ум... вопрос: Нужно ли иметь хотя бы одного персонажа или нет? Может быть, это пустая строка?

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

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

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

Edit:

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

^\w+$

или

^\w*$
  • 0
    Ну, теперь, когда вы упомянули об этом, я также пропустил целый ряд других французских персонажей ...
  • 1
    \ w такой же, как [\ w] с меньшими усилиями при наборе текста
Показать ещё 3 комментария
12

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

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

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

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

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

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

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

10

используйте lookaheads для создания "по крайней мере одного" материала. Поверьте мне это намного проще.

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

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

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

  • 0
    Большое спасибо...
  • 0
    Как бы мы поступили, если хотим добавить _ и - в список?
10

Как насчет:

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

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

^\w+$

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

9

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

IsAlphaNumeric - Строка должна содержать по крайней мере 1 альфу (букву в диапазоне Юникод, указанную в 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();
  • 0
    как насчет только алфавитов
  • 0
    @Shah: я добавил только алфавиты (и только цифры тоже).
6

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

^[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";
}
  • 0
    Шаблон в вашем коде правильный, но шаблон выше проверяет только один экземпляр.
  • 0
    Это было сделано намеренно, пример кода был задуман как поясняющее использование при проверке строки. Кроме того, почему в коде есть маркеры начала и конца строки, которых нет в примере с регулярным выражением.
Показать ещё 7 комментариев
3

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

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$
  • 0
    Именно то, что я хочу ... Спасибо
2

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

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

Дальнейшее чтение на http://unicode.org/reports/tr18/ и в http://www.regular-expressions.info/unicode.html

  • 0
    Если вы просто хотите использовать латынь, используйте p {Latin} вместо p {L}
1

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

  • 0
    Можете ли вы предоставить ссылку или небольшое объяснение.
1

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

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

0

это работает для меня, вы можете попробовать [\ p {Alnum} _]

0

Чтобы проверить всю строку и не разрешать пустые строки, попробуйте

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

^\w * $будет работать ниже комбинации 1 123 1av за AV1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню