Bir dizeyi yalnızca alfanümerik karakterlere izin verecek şekilde nasıl doğrulayabilirim?


117

Normal İfadeler kullanarak bir dizeyi yalnızca alfasayısal karakterlere izin verecek şekilde nasıl doğrulayabilirim?

(Boşluğa da izin vermek istemiyorum).

Yanıtlar:


181

Aşağıdaki ifadeyi kullanın:

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

yani:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}

Peki ya javascript, sanırım aynı şey?
mrblah

4
Veritabanı adlarını veya bunun gibi dahili bir şeyi sterilize ederseniz, bunun İngilizce konuşulan bir ülkede yayınlanmaması umurunuzda olmayacaktır.
Ognyan Dimitrov

15
Normal ifadelerden nefret ediyorum. Sözdizimini asla hatırlamayacağımı biliyorum. Çalışsam bile, her şeyin yeniden unutulduğu bir zaman yakında gelecek.
Sentinel

1
@Phil. Belki, ama o zamana kadar normal ifadeleri bilen birini delege edeceğim ;-)
Sentinel

3
"Normal ifadeler kullanarak bir problemi çözerseniz, o zaman iki probleminiz olur" denmiştir.
O. Jones

205

.NET 4.0'da LINQ kullanabilirsiniz:

if (yourText.All(char.IsLetterOrDigit))
{
    //just letters and digits.
}

yourText.Allsözleşmesi yerine getirilemeyeceği falseiçin ilk sefer char.IsLetterOrDigitraporlarını yürütmeyi durduracak ve geri gönderecektir .falseAll

Not! bu cevap alfasayısalları (tipik olarak AZ, az ve 0-9) kesin olarak kontrol etmez. Bu cevap gibi yerel karakterlere izin verir åäö.

Güncelleme 2018-01-29

Yukarıdaki sözdizimi yalnızca doğru türde tek bir bağımsız değişkene sahip tek bir yöntem kullandığınızda çalışır (bu durumda char).

Birden çok koşul kullanmak için şu şekilde yazmanız gerekir:

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}

1
Çok daha hızlı olmasa şaşırırdım. Derlenecek veya değerlendirilecek normal ifade yok, yalnızca basit bir karşılaştırma.
jgauffin

3
Şimdi bu çok güzel, sade ve basit.
Sentinel

3
Metninizin kesinlikle alfanümerik olduğundan emin olmak istiyorsanız bu başarısız olmaz mı? Tüm rakamlar veya tüm alfabeler olabilir, ancak yine de bu koşulu karşılar.
itsbalur

2
@itsbalur: Evet, ama soru bu değildi.
jgauffin

2
Alfasayısal kümenin AZ, az ve 0-9 olduğunu varsayarsak, bu cevabın tamamen yanlış olduğunu düşünüyorum çünkü bu, Latin olmayan karakterler de dahil olmak üzere tüm Unicode harf ve rakam aralığını kapsıyor. Örneğin, char.IsLetterOrDigit('ก')geri dönecek true. csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
tia

34

Bunu bir regex yerine bir uzantı işlevi ile kolayca yapabilirsiniz ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    for (int i = 0; i < str.Length; i++)
    {
        if (!(char.IsLetter(str[i])) && (!(char.IsNumber(str[i]))))
            return false;
    }

    return true;
}

Yorum başına :) ...

public static bool IsAlphaNum(this string str)
{
    if (string.IsNullOrEmpty(str))
        return false;

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}

2
Bu bir zevk meselesi olabilir, ancak döngüyü "foreach (char c in str) {...}" olarak ifade ederim. Boş bir dizenin Tamam olarak kabul edilip edilmeyeceği uygulamaya bağlıdır, bu yüzden bunu çıkarırım. Ayrıca 6 boş satırı bu kadar önemsiz bir rutine yerleştirmezdim, ama sanırım bu C # / Java / C ++ tarzı - kodlayıcılara ekran emlak tarafından ödeniyor gibi görünüyor. Her neyse, bu doğru yön, yani +1.
Svante

3
Bence doğrusu ISNUMBER yerine, bu durumda isdigit kullanmak istediğiniz sandın - ISNUMBER o hanelilerde veya şeyler için gerçek dönecektir görünüm .; sayılar (kesirler, Roma rakamlarıyla, vs gibi bakın msdn.microsoft.com/ en-us / library / yk2b3t2y.aspx ). Buna göre ve özellikle kötü hissediyorsanız, IsAlphaNum'un içeriği daha da sıkıştırılabilir: return string.IsNullOrEmpty (str)? false: str.ToCharArray (). Hepsi (Char.IsLetterOrDigit);
yığın

4
Char.IsLetter'ın a-zA-Z dışındaki "harfler" için doğru olarak değerlendirileceğini unutmayın. Örneğin, Japonca あ, Çince 的, Korece 한 vb. Unicode "harfler" olarak kabul edilir. Niyetiniz buysa, sorun değil, ancak diğer yanıtlardaki çeşitli normal ifade ifadelerine bakılırsa, bu muhtemelen en çok alfa [sayısal] olarak kabul edilen şey değildir.
Dono

Benim durumumda, IsLetter ve IsNumber'ın yanı sıra IsWhiteSpace'e de ihtiyacım vardı, bu yüzden onu kodunuza ekledim ve mükemmel çalıştı!
Ben Junior

char.IsLetterOrDigitonun yerine IsLetter + IsNumber kullanın
nick_n_a

17

Normal ifadeye dayalı çözümün muhtemelen benim gideceğim yol olduğunu düşünsem de, bunu bir tür içinde özetlemek isterim.

public class AlphaNumericString
{
    public AlphaNumericString(string s)
    {
        Regex r = new Regex("^[a-zA-Z0-9]*$");
        if (r.IsMatch(s))
        {
            value = s;                
        }
        else
        {
            throw new ArgumentException("Only alphanumeric characters may be used");
        }
    }

    private string value;
    static public implicit operator string(AlphaNumericString s)
    {
        return s.value;
    }
}

Şimdi, doğrulanmış bir dizeye ihtiyacınız olduğunda, yöntem imzasının bir AlphaNumericString gerektirmesini sağlayabilirsiniz ve bir tane alırsanız, bunun geçerli olduğunu bilirsiniz (boşlar dışında). Birisi doğrulanmamış bir dizge geçmeye çalışırsa, bir derleyici hatası oluşturur.

Daha meraklı olabilir ve tüm eşitlik işleçlerini uygulayabilir veya eğer umursuyorsanız, düz ol 'dizesinden AlphaNumericString'e açık bir dönüştürme yapabilirsiniz.


Bu yaklaşımı hiç görmedim, ama niyetin netliğini ve gerekçenizi seviyorum. +1.
Cory Evi

1
Bu benim için yeni. Anlamaya çalışıyorum static public implicit operator stringparçasını
Hasan Gulzar

8

AZ, az, 0-9'u kontrol etmem gerekiyordu; normal ifade olmadan (OP normal ifadeyi istemesine rağmen).

Burada çeşitli yanıtları ve yorumları harmanlayarak ve https://stackoverflow.com/a/9975693/292060 adresinden tartışarak , bu, harf veya rakamları test eder, diğer dil harflerinden kaçınır ve kesir karakterleri gibi diğer sayılardan kaçınır.

if (!String.IsNullOrEmpty(testString)
    && testString.All(c => Char.IsLetterOrDigit(c) && (c < 128)))
{
    // Alphanumeric.
}

4

^\w+$ sağlayacaktır a-zA-Z0-9_

^[a-zA-Z0-9]+$Alt çizgiye izin vermemek için kullanın .

Bunların her ikisinin de dizenin boş olmamasını gerektirdiğini unutmayın. Kullanma *yerine +boş dizeleri tanır.


^ \ w + $ 'nızı "-" tire karakterine de izin verecek şekilde nasıl değiştirebilirim?
Neal Davis

@NealDavis^[\w-]+$
Zachafer

2

Dizenin hem harflerin hem de rakamların birleşimi olup olmadığını kontrol etmek için, @jgauffin yanıtını .NET 4.0 ve LINQ kullanarak aşağıdaki gibi yeniden yazabilirsiniz:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}

Bu, alfasayısal ... ile birlikte diğer karakterleri içeren dizeyi yanlış bir şekilde tanıyacaktır ...
nsimeonov

1

Buradaki ile aynı cevap .

Normal olmayan bir ASCII A-z 0-9kontrolü istiyorsanız char.IsLetterOrDigit(), diğer Unicode karakterlerini içerdiğini kullanamazsınız .

Yapabileceğiniz şey, karakter kodu aralıklarını kontrol etmektir.

  • 48 -> 57 sayısaldır
  • 65 -> 90 büyük harftir
  • 97 -> 122 küçük harflerdir

Aşağıdakiler biraz daha ayrıntılıdır, ancak kod golfünden çok anlama kolaylığı içindir.

    public static bool IsAsciiAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
        {
            return false;
        }

        for (int i = 0; i < str.Length; i++)
        {
            if (str[i] < 48) // Numeric are 48 -> 57
            {
                return false;
            }

            if (str[i] > 57 && str[i] < 65) // Capitals are 65 -> 90
            {
                return false;
            }

            if (str[i] > 90 && str[i] < 97) // Lowers are 97 -> 122
            {
                return false;
            }

            if (str[i] > 122)
            {
                return false;
            }
        }

        return true;
    }

0

Cletus'un cevabına göre yeni uzantı oluşturabilirsiniz.

public static class StringExtensions
{        
    public static bool IsAlphaNumeric(this string str)
    {
        if (string.IsNullOrEmpty(str))
            return false;

        Regex r = new Regex("^[a-zA-Z0-9]*$");
        return r.IsMatch(str);
    }
}

-8

NET çerçevesinde hazır ve yerleşik koda güvenmemenizi, yeni bir çözüm getirmeyi denemenizi öneririm .. Yaptığım şey bu ..

public  bool isAlphaNumeric(string N)
{
    bool YesNumeric = false;
    bool YesAlpha = false;
    bool BothStatus = false;


    for (int i = 0; i < N.Length; i++)
    {
        if (char.IsLetter(N[i]) )
            YesAlpha=true;

        if (char.IsNumber(N[i]))
            YesNumeric = true;
    }

    if (YesAlpha==true && YesNumeric==true)
    {
        BothStatus = true;
    }
    else
    {
        BothStatus = false;
    }
    return BothStatus;
}

2
Lütfen kodunuza bir açıklama ekleyebilir misiniz? Sadece döküm kodu genellikle burada hoş karşılanmaz
Draken

Ayrıca normal ifadeler de istediler, bu normal ifadeler değil
Draken

Yorumlarınız ve gözlemleriniz için teşekkürler .. tavsiye ettiğim gibi, kod yazmak için kendi yaklaşımım var.
Mehdi Al Aradi

5
.Net'teki ön derleme koduna güvenmeme konusundaki yorumunuz pek mantıklı değil, kesinlikle ön-derleme koda güvenmemeniz gerekiyorsa, char.IsNumber()yöntemi önceden oluşturulmuş kod olduğu için kullanmamalısınız ?
Draken

4
Bu kod, onu kendiniz yeniden icat etmenin neden bu kadar kötü bir fikir olduğuna dair harika bir örnek - aslında yapmak istediğiniz şeyi yapmıyor! ("@ 1a" dizesi yanlış olarak doğru döndürür, "a" dizesi yanlış döndürür)
Flexo
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.