Alfasayısal ve alt çizgiler için Düzenli İfade


585

Bir dize yalnızca büyük ve küçük harfler, sayılar ve alt çizgiler içeriyorsa kontrol eden normal bir ifade istiyorum.

regex 

9
Farklı regex motorlarının alfanümeriklerle eşleşmesi için farklı araçlara sahip olması üzücü. Bunun gibi bir soru (daha belirsiz, herhangi bir dil / regex aroması belirtilmemiş), çok uzun veya en azından her aroma üzerinde çok organize bir cevap gerektirir.
Wiktor Stribiżew

Yanıtlar:


938

Yalnızca bu karakterleri (veya boş bir dizeyi) içeren bir dizeyle eşleştirmek için şunu deneyin:

"^[a-zA-Z0-9_]*$"

Bu, .NET düzenli ifadeleri ve muhtemelen diğer birçok dil için de çalışır.

Yıkmak:

^ : 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

Boş dizelere izin vermek istemiyorsanız, * yerine + kullanın.


Diğerlerinin de belirttiği gibi, bazı normal ifadeler için kısayollar vardır [a-zA-Z0-9_]. .NET regex dilinde, ECMAScript davranışını açabilir ve \wstenografi (sağlama ^\w*$veya ^\w+$) olarak kullanabilirsiniz. Diğer dillerde ve varsayılan olarak .NET'te \wbiraz daha geniş olduğunu ve diğer Unicode karakterleriyle de eşleşeceğini unutmayın (bunu işaret ettiği için Jan'a teşekkürler). Bu nedenle, yalnızca bu karakterlerle gerçekten eşleşmek istiyorsanız , açık (uzun) formu kullanmak muhtemelen en iyisidir.


8
Eğer Almanya'ya giderseniz ya da herhangi bir Almanca metin görürseniz ne dediğimi görürsünüz.
Windows programcısı

30
\ w ve [A-Za-z0-9_] çoğu regex aromasında eşdeğer değildir. \ w aksan harfleri, diğer senaryo harfleri, vb. içerir
Jan Goyvaerts

4
Orijinal soruda "büyük ve küçük harfler" yazıyordu, bu yüzden Latince olmayan scriptlerden gelen "harfler" eşleşmelidir.
Trejkaz

3
[\p{upper}\p{lower}\p{gc=Number}_]birleştirmek için hiçbir karakter olmadığını varsayarak bunu doğru yapmak için tek yapmanız gereken.
tchrist

1
Görünüşe göre preg_match, deseninizin normalde eğik çizgiler olan sınırlayıcılarla kapatılmasını gerektirir. Yani "/ ^ [a-zA-Z0-9 _] * $ /" gerekir. Daha fazla bilgi için bu soruya bakın: stackoverflow.com/questions/6445133/… . Bu sayfaya da bakınız: forums.phpfreaks.com/topic/…
Charlie

346

Burada çok fazla ayrıntı var ve buna derinden karşıyım, bu yüzden kesin cevabım şöyle olacaktır:

/^\w+$/

\weşdeğerdir [A-Za-z0-9_], bu da hemen hemen istediğiniz şeydir. (karışıma unicode eklemedikçe)

+Nicelik belirtecini kullanarak bir veya daha fazla karakterle eşleşirsiniz. Boş bir dizeyi de kabul etmek istiyorsanız *bunun yerine kullanın.


67
\wgenellikle yalnızca ASCII ile sınırlı değildir.
tchrist

26
İngilizce dünyadaki tek dil değildir, bu yüzden kabul edilen cevap olmalı [a-z]ve varyasyonları olmamalıdır . \wlatin olmayan karakterleri de yakalar. Like šēēāorкукареку
Alex

1
O'Reilly "Düzenli İfadelere
hakim olma

36

Her karakterin gereksinimlerinize uygun olup olmadığını kontrol etmek istiyorsunuz, bu yüzden kullanıyoruz:

[A-Za-z0-9_]

Ayrıca steno versiyonunu bile kullanabilirsiniz:

\w

Eşdeğerdir (bazı regex tatlarında, kullanmadan önce kontrol ettiğinizden emin olun). Ardından tüm dizenin eşleşmesi gerektiğini belirtmek için şunu kullanırsınız:

^

Dizenin bu karakterle başlaması gerektiğini belirtmek için

$

Dizeyi belirtmek için o karakterle bitmelidir. Sonra kullan

\w+ or \w*

"1 veya daha fazla" veya "0 veya daha fazla" belirtmek için. Hepsini bir araya getirirsek, elimizde:

^\w*$

10
\ w ve [A-Za-z0-9_] çoğu regex aromasında eşdeğer değildir. \ w aksan harfleri, diğer senaryo harfleri, vb. içerir
Jan Goyvaerts

31

Um ... soru: En az bir karaktere mi sahip olması gerekiyor mu? Boş bir dize olabilir mi?

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

En az bir büyük veya küçük harf alfasayısal veya alt çizgi yapar. Sıfır uzunluk olabilirse, sadece + yerine * yazın

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

Düzenle:

Aksanların dahil edilmesi gerekiyorsa (cedilla - ç gibi), yukarıdakiyle aynı olan ancak aksan karakterleri içeren kelime karakterini kullanmanız gerekir:

^\w+$

Veya

^\w*$

Şimdi bahsettiğinize göre, diğer Fransız karakterlerini de kaçırdım ...
BenAlabaster

1
\ w daha az yazma çabası ile [\ w] ile aynıdır
Jan Goyvaerts

Evet, hala ^ + veya * ve ihtiyaç $ - \ o değil bu kelime karakterleri içerdiğini sadece kontroller w sadece kelime karakterler içeriyor ...
BenAlabaster

garip bir şekilde, bu hala $ işaretine izin verir.
Induster

@Induster, BenAlabaster'ın işaret ettiği şey
Sebas

27

Daha ayrıntılı olmasına rağmen \w, kişisel olarak tam POSIX karakter sınıfı adlarının okunabilirliğini takdir ediyorum ( http://www.zytrax.com/tech/web/regex.htm#special ), bu yüzden şunu söyleyebilirim:

^[[:alnum:]_]+$

Ancak, yukarıdaki bağlantılardaki belgeler \w"0 - 9, A - Z ve a - z (POSIX [: alnum:]) aralığındaki herhangi bir karakterle eşleşecek" ifadesini belirtirken, bunun doğru olduğunu bulamadım . grep -PYine de değil . Kullanıyorsanız alt çizgiyi açıkça eklemeniz gerekir, [:alnum:]ancak kullanıyorsanız alt çizgiyi eklemeniz gerekir \w. Kısa ve tatlı için aşağıdakileri yenemezsin:

^\w+$

Okunabilirlikle birlikte, POSIX karakter sınıflarını ( http://www.regular-expressions.info/posixbrackets.html ) kullanmak, normal ifadenizin ASCII olmayan dizelerde çalışabileceği anlamına gelir; diğer karakter kümelerinden farklı olabilecek ve bu nedenle yakalamak isteyebileceğiniz bazı ASCII olmayan karakterleri (letters gibi harfler) hariç tutabilecek ASCII karakterlerinin temel sıralaması.


22

Bilgisayar Bilimlerinde, Alfasayısal bir değer genellikle ilk karakterin bir sayı değil, bir alfabe veya alt çizgi olduğu anlamına gelir. Daha sonra bir karakter olabilir 0-9, A-Z, a-zya da çizgi ( _).

Bunu nasıl yapacağınız aşağıda açıklanmıştır:

Php altında test edilmiştir:

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

ya da al bunu

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

ve geliştirme dilinize yerleştirin.


17

Nasıl olur:

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

... açık olmak istiyorsanız veya:

^\w+$

... özlü (Perl sözdizimi) tercih ederseniz.


12

"en az bir" şeyi yapmak için gözcüleri kullanın. Güven bana çok daha kolay.

En az bir rakam ve bir harf içeren 1-10 karakter gerektiren bir örnek:

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

NOT: \ w kullanmış olabilir, ancak \ w "kelime karakteri" nin karakter kapsamını artıran ECMA / Unicode değerlendirmeleri devreye girer.


Listeye _ ve - eklemek istersek nasıl yapardık?
Rahi

10

Dize için yaptığım bu çok dilli uzantıları deneyin.

IsAlphaNumeric - Dize en az 1 alfa (Unicode aralıktaki harf, charSet içinde belirtilir) ve en az 1 sayı (numSet içinde belirtilir) içermelidir. Ayrıca, dize yalnızca alfa ve sayılardan oluşmalıdır.

IsAlpha - Dize en az 1 alfa (belirtilen charSet dilinde) içermeli ve yalnızca alfa içermelidir.

IsNumeric - Dize en az 1 sayı içermelidir (belirtilen numSet dilinde) ve yalnızca sayıları içermelidir.

İstenen dil için charSet / numSet aralığı belirlenebilir. Unicode aralıkları aşağıdaki bağlantıda mevcuttur:

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

Kullanımı:

        //English
        string test = "AASD121asf";

        //Greek
        //string test = "Ϡϛβ123";

        //Bengali
        //string test = "শর৩৮";

        //Hindi
        //string test = @"क़लम३७ख़";

        bool isAlphaNum = test.IsAlphaNumeric();

@Shah: Ben sadece alfabe (ve sadece sayıları) ekledim.
Shantanu

8

Aşağıdaki normal ifade alfasayısal karakterler ve alt çizgi ile eşleşir:

^[a-zA-Z0-9_]+$

Örneğin, Perl'de:

#!/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";
}

Kodunuzdaki desen doğrudur, ancak yukarıdaki desen yalnızca tek bir örneği kontrol eder.
BenAlabaster

Bu kasıtlıydı, kod örneği aslında bir dizeyi kontrol etmede açıklayıcı bir kullanım olarak tasarlandı. Ayrıca kodun neden regex örneğinde olmayan satır başlangıcı ve sonu işaretleyicileri de vardır.
Jay

1
@ Windows programcı - en.wikipedia.org/wiki/Alphanumeric - latin alfabesi değil, "latin karakter seti" fonetik vb Tamamen bir semantik sorunu içerir, ancak ben şahsen AZ terimi alfasayısal ortak kullanımı ile gidip ne 0-9.
Jay

2
ñ Latin Amerika da dahil olmak üzere İspanyolca alfabedeki bir harftir.
Windows programcısı

2
"Bir dize yalnızca büyük ve küçük harfler, sayılar ve alt çizgiler içerip içermediğini kontrol eden normal bir ifadeye sahip olmak isterim" bunu Latin harfleriyle sınırlamaz. "Aşağıdaki normal ifade alfasayısal karakterlerle ve alt çizgi ile eşleşir", Latin harfleriyle sınırlamaz. "^ [a-zA-Z0-9 _] + $" başarısız.
Windows programcısı

6

Bu, çoğu durumda işe yarayacaktır.

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

Ve çoğunlukla demek istediğim,

abcd       True
abcd12     True
ab12cd     True
12abcd     True

1234       False


açıklama

  1. ^ ... $ - ile başlayan ve biten kalıbı eşleştirin
  2. [\d]* - sıfır veya daha fazla basamağı eşleştirin
  3. [a-z_] - bir alfabe veya alt çizgiyi eşleme
  4. [a-z\d_]* - bir alfabe veya rakam veya alt çizgiyi eşleme
  5. /gi - dize genelinde ve büyük / küçük harf duyarsız

2
Orijinal sorunun mektubun mevcut olması gerekliliği yoktu.
Dmitry Kuzminov

Hangi mektuptan bahsediyorsun? Normal ifadem soruda sorulanı içeriyor. Alfabe, sayılar, alt çizgi
Chinmaya Pati

1234Yazar tarafından istenen dilden kelime. Diliniz daha kısıtlayıcı.
Dmitry Kuzminov

4

Benim için alfa, sayısal ve alfa sayısal arasında ayrım yapmak istediğim bir sorun vardı, bu yüzden alfasayısal bir dizenin en az bir alfa ve en az bir sayısal içermesini sağlamak için kullandım:

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

Tam olarak istediğim şey ... Teşekkürler
Aniket kale

3

En az 1 karakter ve en fazla 255 karakter belirtmek için bir niceleyiciyle istediğiniz ifadeyi aşağıda bulabilirsiniz

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


2

Maçlarınızda Latin ve Unicode karakterleri kullanmadığınıza inanıyorum. Örneğin, "ã" veya "ü" karakterleri almanız gerekiyorsa, "\ w" kullanımı çalışmaz.

Alternatif olarak, bu yaklaşımı kullanabilirsiniz:

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

Umarım yardımcı olur!


1

Dizenin tamamını kontrol etmek ve boş dizelere izin vermemek için,

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

1

^\w*$ Aşağıdaki kombinasyonlar için çalışacak

1
123
1av
pRo
av1

Boş bir çizgi ne olacak. Aynı zamanda alfasayısal bir dize mi?
v010dya

0

bu benim için çalışıyor deneyebilirsin

[\\p{Alnum}_]

0

Bu benim için çalışıyor, bunu O'Reilly'nin "Düzenli İfadelerde Uzmanlaşma" da buldu:

/^\w+$/

Açıklama:

  • ^ dizenin başındaki konumu belirtir
    • \ w + herhangi bir kelime karakteriyle eşleşir ([a-zA-Z0-9_] 'a eşittir)
    • "+" Nicelik belirteci - Mümkün olduğunca çok kez bir ve sınırsız kez eşleşir, gerektiğinde geri verir (açgözlü)
  • $, dizenin sonundaki konumu bildirir

Kendinizi doğrulayın:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.