Я хотів би мати регулярний вираз, який перевіряє, чи містить рядок лише великі і малі літери, цифри та підкреслення.
Я хотів би мати регулярний вираз, який перевіряє, чи містить рядок лише великі і малі літери, цифри та підкреслення.
Відповіді:
Щоб відповідати рядку, що містить лише ті символи (або порожній рядок), спробуйте
"^[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
дещо ширше, і він відповідатиме іншим типам символів Unicode (дякую Джану, що вказав на це). Тож якщо ви дійсно маєте намір зіставити лише ті символи, використання явної (довшої) форми, мабуть, найкраще.
[\p{upper}\p{lower}\p{gc=Number}_]
все, що потрібно для цього правильно, припускаючи, що символів, що поєднуються, немає.
Тут багато багатослівностей, і я категорично проти, тому моєю остаточною відповіддю буде:
/^\w+$/
\w
еквівалент [A-Za-z0-9_]
, що майже все, що ви хочете. (якщо тільки ми не введемо unicode до суміші)
За допомогою +
квантора ви будете відповідати одному або більше символів. Якщо ви також хочете прийняти порожню рядок, скористайтеся *
натомість.
\w
зазвичай не обмежується лише ASCII.
[a-z]
та її варіаціями. \w
також захопить нелатинські символи. Like šēēā
orкукареку
Ви хочете перевірити, чи відповідає кожен символ вашим вимогам, тому ми використовуємо:
[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_]*$
і розмістіть його мовою вашої розробки.
скористайтеся пунктами пошуку, щоб зробити "принаймні один" матеріал. Повірте, це набагато простіше.
Ось приклад, який потребує 1-10 символів, що містить принаймні одну цифру та одну букву:
^(?=.*\d)(?=.*[A-Za-z])[A-Za-z0-9]{1,10}$
ПРИМІТКА: можна було використовувати \ w, але тоді міркування ECMA / Unicode вступають у гру, збільшуючи охоплення символів \ w "символу слова".
Спробуйте ці багатомовні розширення, які я зробив для рядка.
IsAlphaNumeric - Рядок повинен містити принаймні 1 альфа (літера в діапазоні Unicode, зазначена в charSet) та найменше 1 число (вказане в numSet). Також рядок повинен містити лише альфа та цифри.
IsAlpha - String повинен містити принаймні 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
Я вважаю, що ви не приймаєте латинських та Unicode символів у своїх матчах. Наприклад, якщо вам потрібно взяти символи "ã" або "ü", використання "\ w" не буде працювати.
Ви також можете використовувати такий підхід:
^[A-ZÀ-Ýa-zà-ý0-9_]+$
Сподіваюся, це допомагає!
Щоб перевірити весь рядок і не допустити порожніх рядків, спробуйте
^[A-Za-z0-9_]+$
Це працює для мене. Це було знайдено в O'Reilly "Освоєння регулярних виразів":
/^\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}`);
});
}