Я хотел бы иметь регулярное выражение, которое проверяет, содержит ли строка только верхние и строчные буквы, цифры и символы подчеркивания.
Чтобы сопоставить строку, содержащую только те символы (или пустую строку), попробуйте
"^[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
несколько шире и будет соответствовать другим типам символов юникода (спасибо Ян за это указывает). Поэтому, если вы действительно собираетесь сопоставлять только эти символы, использование явной (более длинной) формы, вероятно, лучше всего.
Здесь много многословия, и я глубоко против этого, поэтому мой окончательный ответ был бы следующим:
/^\w+$/
\w
эквивалентен [A-Za-z0-9_]
, что в значительной степени зависит от того, что вы хотите. (если мы не вводим unicode в микс)
Используя квантор +
, вы будете сопоставлять один или несколько символов. Если вы хотите принять пустую строку, используйте *
вместо этого.
\w
обычно не ограничивается только ASCII.
[az]
и его варианты. \w
будет также захватывать нелатинские символы. Нравится šēēā
или кукареку
Вы хотите проверить соответствие каждого символа вашим требованиям, поэтому мы используем:
[A-Za-z0-9_]
И вы даже можете использовать сокращенную версию:
\w
Что эквивалентно (в некоторых вариантах регулярных выражений, поэтому убедитесь, что вы проверили, прежде чем использовать его). Затем, чтобы указать, что вся строка должна соответствовать, вы используете:
^
Чтобы указать, что строка должна начинаться с этого символа, используйте
$
Чтобы указать, что строка должна заканчиваться этим символом. Затем используйте
\w+ or \w*
Чтобы указать "1 или более", или "0 или более". Соединяя все это, мы имеем:
^\w*$
Хотя он более подробный, чем \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-символы (буквы, такие как œ), которые вы можете захотеть захватить.
Ум... вопрос: Нужно ли иметь хотя бы одного персонажа или нет? Может быть, это пустая строка?
^[A-Za-z0-9_]+$
Будет делать по крайней мере один верхний или нижний регистр буквенно-цифровой или подчеркивания. Если это может быть нулевая длина, то просто замените + для *
^[A-Za-z0-9_]*$
Edit:
Если диакритики должны быть включены (например, cedilla - ç), тогда вам нужно будет использовать символ слова, который делает то же самое, что и выше, но включает диакритические символы:
^\w+$
или
^\w*$
В информатике буквенно-цифровое значение часто означает, что первый символ не является числом, а является алфавитом или подчеркиванием. После этого символ может быть 0-9
, A-Z
, A-Z
или подчеркивание (_
).
Вот как вы это сделаете:
Протестировано под php:
$regex = '/^[A-Za-z_][A-Za-z\d_]*$/'
или возьмите это
^[A-Za-z_][A-Za-z\d_]*$
и поместите его на свой язык разработки.
используйте lookaheads для создания "по крайней мере одного" материала. Поверьте мне это намного проще.
Вот пример, который потребует 1-10 символов, содержащих по крайней мере одну цифру и одну букву:
^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$
ПРИМЕЧАНИЕ: возможно, он использовал \w, но затем учитываются соображения ECMA/Unicode, увеличивающие охват символов символа слова \w ".
Как насчет:
^([A-Za-z]|[0-9]|_)+$
... если вы хотите быть явным, или:
^\w+$
... если вы предпочитаете краткий (синтаксис Perl).
Попробуйте эти многоязычные расширения, которые я сделал для строки.
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();
Следующее регулярное выражение соответствует буквенно-цифровым символам и подчеркиванию:
^[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";
}
Для меня была проблема в том, что я хочу различать альфа, числовые и буквенные числа, поэтому для того, чтобы буквенно-цифровая строка содержала по крайней мере одну альфу и по крайней мере одну цифру, я использовал:
^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$
Для тех, кто ищет алфавитно-цифровое сопоставление в формате Юникод, вы можете сделать что-то вроде:
^[\p{L} \p{Nd}_]+$
Дальнейшее чтение на http://unicode.org/reports/tr18/ и в http://www.regular-expressions.info/unicode.html
сопоставление диакритики в регулярном выражении открывает целую банку червей, особенно при рассмотрении Unicode. Возможно, вы захотите прочитать о локациях Posix в частности.
Вот регулярное выражение для того, что вы хотите с квантификатором, чтобы указать не менее 1 символа и не более 255 символов
[^ a-zA-Z0-9 _] {1,255}
это работает для меня, вы можете попробовать [\ p {Alnum} _]
Чтобы проверить всю строку и не разрешать пустые строки, попробуйте
^[A-Za-z0-9_]+$
^\w * $будет работать ниже комбинации 1 123 1av за AV1