Я хотел бы иметь регулярное выражение, которое проверяет, содержит ли строка только заглавные и строчные буквы, цифры и подчеркивания.
Я хотел бы иметь регулярное выражение, которое проверяет, содержит ли строка только заглавные и строчные буквы, цифры и подчеркивания.
Ответы:
Чтобы сопоставить строку, содержащую только эти символы (или пустую строку), попробуйте
"^[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
он несколько шире и будет соответствовать другим видам символов Юникода (спасибо Яну за указание на это). Поэтому, если вы действительно хотите сопоставить только эти символы, лучше использовать явную (более длинную) форму.
[\p{upper}\p{lower}\p{gc=Number}_]
это все, что вам нужно, чтобы сделать это правильно, при условии, что нет комбинирующих символов.
Здесь много многословия, и я категорически против, поэтому мой окончательный ответ:
/^\w+$/
\w
эквивалентно [A-Za-z0-9_]
, что в значительной степени то, что вы хотите. (если мы не введем юникод в микс)
Используя +
квантификатор, вы сопоставите один или несколько символов. Если вы также хотите принять пустую строку, используйте *
вместо этого.
\w
обычно не ограничивается только ASCII.
[a-z]
его варианты. \w
будет захватывать нелатинские символы тоже. Нравится šēēā
иликукареку
Вы хотите убедиться, что каждый символ соответствует вашим требованиям, поэтому мы используем:
[A-Za-z0-9_]
И вы даже можете использовать сокращенную версию:
\w
Что эквивалентно (в некоторых разновидностях регулярных выражений, поэтому обязательно проверьте, прежде чем использовать его). Затем, чтобы указать, что вся строка должна совпадать, вы используете:
^
Чтобы указать, что строка должна начинаться с этого символа, затем используйте
$
Чтобы указать, строка должна заканчиваться этим символом. Тогда используйте
\w+ or \w*
Для обозначения «1 или более» или «0 или более». Собрав все это вместе, мы имеем:
^\w*$
Гм ... вопрос: нужно ли хотя бы один символ или нет? Это может быть пустая строка?
^[A-Za-z0-9_]+$
Подойдет хотя бы один верхний или нижний регистр буквенно-цифровой или подчеркивания. Если это может быть нулевая длина, тогда просто замените + на *
^[A-Za-z0-9_]*$
Редактировать:
Если необходимо включить диакритические знаки (например, cedilla - ç), вам необходимо использовать символ слова, который соответствует описанному выше, но содержит диакритические знаки:
^\w+$
Или
^\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 символы (буквы, такие как œ), которые вы, возможно, захотите захватить.
В информатике буквенно-цифровое значение часто означает, что первый символ не является числом, а представляет собой алфавит или подчеркивание. После этого персонаж может быть 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 «символ слова».
Попробуйте эти многоязычные расширения, которые я сделал для строки.
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();
Следующее регулярное выражение соответствует буквенно-цифровым символам и подчеркиванию:
^[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";
}
Это должно работать в большинстве случаев.
/^[\d]*[a-z_][a-z\d_]*$/gi
И под большинством я имею в виду,
abcd True
abcd12 True
ab12cd True
12abcd True
1234 False
^ ... $
- сопоставить шаблон, начинающийся и заканчивающийся[\d]*
- соответствовать нулю или более цифр[a-z_]
- соответствовать алфавиту или подчеркиванию[a-z\d_]*
- соответствовать алфавиту или цифре или подчеркиванию/gi
- сопоставлять глобально через строку и без учета регистра1234
это слово из языка , запрошенного автором. Ваш язык более строгий.
Для меня возникла проблема, заключающаяся в том, что я хочу провести различие между буквенно-цифровым и буквенно-цифровым, поэтому для обеспечения того, чтобы буквенно-цифровая строка содержала хотя бы одну букву и хотя бы одну цифру, я использовал:
^([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.
Я полагаю, что вы не принимаете символы латиницы и Юникода в своих матчах. Например, если вам нужно использовать символы «ã» или «ü», использование «\ w» не сработает.
Вы также можете использовать этот подход:
^[A-ZÀ-Ýa-zà-ý0-9_]+$
Надеюсь, поможет!
Чтобы проверить всю строку и не допустить пустых строк, попробуйте
^[A-Za-z0-9_]+$
Это работает для меня, нашел это в "Освоение регулярных выражений" О'Рейли:
/^\w+$/
Объяснение:
Проверьте себя:
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}`);
});
}