Регулярний вираз для буквено-цифрових та підкреслених


585

Я хотів би мати регулярний вираз, який перевіряє, чи містить рядок лише великі і малі літери, цифри та підкреслення.

regex 

9
Шкода, що різні двигуни регулярного випромінювання мають різні засоби, щоб відповідати буквено-цифровим. Питання на кшталт цього (досить розпливчасте, не вказаний аромат мови / регулярного вираження) вимагає дуже довгого або, принаймні, дуже організованого відповіді, що зупиняється на кожному ароматі.
Wiktor Stribiżew

Відповіді:


938

Щоб відповідати рядку, що містить лише ті символи (або порожній рядок), спробуйте

"^[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 (дякую Джану, що вказав на це). Тож якщо ви дійсно маєте намір зіставити лише ті символи, використання явної (довшої) форми, мабуть, найкраще.


8
Якщо ви коли-небудь їдете до Німеччини або якщо ви коли-небудь побачите будь-який німецький текст, ви побачите, що я говорю.
програміст Windows

30
\ w і [A-Za-z0-9_] не є еквівалентними у більшості ароматів регулярних виразів. \ w включає листи з діакритикою, листи з інших сценаріїв тощо.
Ян Гойвартс

4
У початковому запитанні було сказано "великі і малі літери", тому, здавалося б, "літери" з не латинських сценаріїв повинні відповідати.
Трежказ

3
[\p{upper}\p{lower}\p{gc=Number}_]все, що потрібно для цього правильно, припускаючи, що символів, що поєднуються, немає.
tchrist

1
Схоже, що preg_match вимагає, щоб ваш шаблон був укладений розмежувачами, які зазвичай є косою рисою. Тож вам знадобиться "/ ^ [a-zA-Z0-9 _] * $ /". Дивіться це запитання для отримання додаткової інформації: stackoverflow.com/questions/6445133/… . Дивіться також цю сторінку: forums.phpfreaks.com/topic/…
Чарлі

346

Тут багато багатослівностей, і я категорично проти, тому моєю остаточною відповіддю буде:

/^\w+$/

\wеквівалент [A-Za-z0-9_], що майже все, що ви хочете. (якщо тільки ми не введемо unicode до суміші)

За допомогою +квантора ви будете відповідати одному або більше символів. Якщо ви також хочете прийняти порожню рядок, скористайтеся *натомість.


67
\wзазвичай не обмежується лише ASCII.
tchrist

26
Англійська мова не є єдиною мовою у світі, тому це має бути прийнятою відповіддю, а не [a-z]та її варіаціями. \wтакож захопить нелатинські символи. Like šēēāorкукареку
Alex

1
Підтверджено на сторінці 318 O'Reilly "Освоєння регулярних виразів"
guideotex

36

Ви хочете перевірити, чи відповідає кожен символ вашим вимогам, тому ми використовуємо:

[A-Za-z0-9_]

І ви навіть можете використовувати скорочену версію:

\w

Що еквівалентно (у деяких смакових регексах, тому переконайтеся, що ви перевіряєте, перш ніж використовувати). Потім, щоб вказати, що весь рядок повинен відповідати, ви використовуєте:

^

Для позначення рядка потрібно починати з цього символу, а потім використовувати

$

Щоб вказати, рядок повинен закінчуватися цим символом. Потім використовуйте

\w+ or \w*

Для позначення "1 або більше" або "0 або більше". Збираючи все це разом, ми маємо:

^\w*$

10
\ w і [A-Za-z0-9_] не є еквівалентними у більшості ароматів регулярних виразів. \ w включає листи з діакритикою, листи з інших сценаріїв тощо.
Ян Гойвартс

31

Гм ... питання: чи потрібно мати хоча б один символ чи ні? Чи може це бути порожній рядок?

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

Зробить щонайменше одну верхню або нижню літери буквено-цифровим або підкресленням. Якщо вона може бути нульовою довжиною, просто замініть + на *

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

Редагувати:

Якщо потрібно включити діакритику (наприклад, cedilla - ç), то вам знадобиться використовувати символ слова, який робить те саме, що описано вище, але включає діакритичні символи:

^\w+$

Або

^\w*$

Ну а тепер, коли ви це згадуєте, я також пропустив цілу купу інших французьких персонажів ...
BenAlabaster

1
\ w - це те саме, що [\ w] з меншими зусиллями набору тексту
Ян Гойвартс

Так, вам все одно потрібні символи + або *, а ^ і $ - \ w просто перевіряє, що воно містить символи слова, а не те, що воно містить лише символи слова ...
BenAlabaster

як не дивно, це все ще дозволяє знак $.
Induster

@Induster, це через те, що BenAlabaster щойно зазначив
Себас

27

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


22

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

Ось як би ви це зробили:

Тестовано під php:

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

або візьми це

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

і розмістіть його мовою вашої розробки.


17

Як щодо:

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

... якщо ви хочете отримати явний характер, або:

^\w+$

... якщо ви віддаєте перевагу стислий (синтаксис Perl).


12

скористайтеся пунктами пошуку, щоб зробити "принаймні один" матеріал. Повірте, це набагато простіше.

Ось приклад, який потребує 1-10 символів, що містить принаймні одну цифру та одну букву:

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

ПРИМІТКА: можна було використовувати \ w, але тоді міркування ECMA / Unicode вступають у гру, збільшуючи охоплення символів \ w "символу слова".


Як би ми зробили, якщо хочемо додати _ та - до списку?
Рахі

10

Спробуйте ці багатомовні розширення, які я зробив для рядка.

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();

@Shah: Я додав єдині алфавіти (і лише числа).
Шантану

8

Наступний регулярний вираз відповідає буквено-цифровим символам та підкресленням:

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

Шаблон у вашому коді правильний, але вищевказаний шаблон перевіряє лише один екземпляр.
BenAlabaster

Це було навмисно, зразок коду був задуманий як уточнююче використання при фактичній перевірці рядка. Крім того, чому в коді є початок і кінець рядкових маркерів, які також відсутні в прикладі регулярного вираження.
Джей

1
@Windows програміст - en.wikipedia.org/wiki/Alphanumeric - латинський алфавіт , а не "латинський набір символів", що включає діакритику і т. Д. Очевидно, що це семантика, але я особисто переживаю загальне використання терміна буквено-цифровий як AZ та 0-9.
Джей

2
- літера алфавіту іспанською мовою, в тому числі в Латинській Америці.
Програміст Windows

2
"Я хотів би мати регулярний вираз, який перевіряє, чи містить рядок лише великі і малі літери, цифри та підкреслення", не обмежуючи це латинськими літерами. "Наступний регулярний вираз відповідає буквено-цифровим символам та підкресленню" не обмежує його латинськими літерами. "^ [a-zA-Z0-9 _] + $" не вдається.
Програміст Windows

6

Це повинно працювати в більшості випадків.

/^[\d]*[a-z_][a-z\d_]*$/gi

І я маю на увазі більшість,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


Пояснення

  1. ^ ... $ - відповідати шаблону, починаючи і закінчуючи
  2. [\d]* - відповідають нулю або більше цифр
  3. [a-z_] - відповідність алфавіту або підкреслення
  4. [a-z\d_]* - відповідність алфавіту або цифри або підкреслення
  5. /gi - співпадають у всьому світі за рядком та нечутливим до регістру

2
Початкове запитання не вимагало наявності листа.
Дмитро Кузьмінов

Про який лист ви говорите? Мій регулярний вираз містить той, що задається у запитанні. Алфавіти, цифри, підкреслення
Chinmaya Pati

1234це слово з мови , запитаного автором. Ваша мова більш обмежувальна.
Дмитро Кузьмінов

4

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

^([a-zA-Z_]{1,}\d{1,})+|(\d{1,}[a-zA-Z_]{1,})+$

Саме те, що я хочу ... Спасибі
Aniket kale

3

Ось регулярний вираз для того, що ви хочете, щоб за допомогою квантора вказати принаймні 1 символ і не більше 255 символів

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

2

Для тих, хто шукає буквено-цифрові відповідники з однокольоровим кодом, ви можете зробити щось на кшталт:

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

Подальше читання за посиланням http://unicode.org/reports/tr18/ та за адресою http://www.regular-expressions.info/unicode.html


Якщо ви просто хочете, щоб латинь зробила p {Latin} замість p {L}
Август

2

Я вважаю, що ви не приймаєте латинських та Unicode символів у своїх матчах. Наприклад, якщо вам потрібно взяти символи "ã" або "ü", використання "\ w" не буде працювати.

Ви також можете використовувати такий підхід:

^[A-ZÀ-Ýa-zà-ý0-9_]+$

Сподіваюся, це допомагає!



1

^\w*$ буде працювати для комбінацій нижче

1
123
1av
pRo
av1

А що з порожнім рядком Це також буквено-цифровий рядок?
v010dya


0

Це працює для мене. Це було знайдено в O'Reilly "Освоєння регулярних виразів":

/^\w+$/

Пояснення:

  • ^ затверджує позицію на початку рядка
    • \ w + відповідає будь-якому символу слова (рівний [a-zA-Z0-9_])
    • Квантифікатор "+" - підходить між одним і необмеженим часом, якомога більше разів, віддаючи за необхідністю (жадібно)
  • $ затверджує позицію в кінці рядка

Перевірте себе:

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}`);
    });
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.