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

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

Ответы [ 18 ]

828 голосов
/ 03 декабря 2008

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

"^[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 несколько шире и будет соответствовать другим видам символов Юникода (спасибо Яну за указание на это). Поэтому, если вы действительно хотите сопоставить только этих символов, лучше использовать явную (более длинную) форму.

300 голосов
/ 05 декабря 2008

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

/^\w+$/

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

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

35 голосов
/ 03 декабря 2008

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

[A-Za-z0-9_]

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

\w

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

^

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

$

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

\w+ or \w*

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

^\w*$
25 голосов
/ 03 декабря 2008

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

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

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

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

Edit:

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

^\w+$

Или

^\w*$
25 голосов
/ 10 июня 2012

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

17 голосов
/ 31 января 2012

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

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

Проверено под php:

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

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

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

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

13 голосов
/ 03 декабря 2008

Как насчет:

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

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

^\w+$

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

11 голосов
/ 12 ноября 2010

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

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

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

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

9 голосов
/ 11 января 2012

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

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();
8 голосов
/ 03 декабря 2008

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

^[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";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...