Wie kann ich eine Zeichenfolge überprüfen, um nur alphanumerische Zeichen darin zuzulassen?

117

Wie kann ich eine Zeichenfolge mit regulären Ausdrücken überprüfen, um nur alphanumerische Zeichen darin zuzulassen?

(Ich möchte auch keine Leerzeichen zulassen).

mrblah
quelle

Antworten:

181

Verwenden Sie den folgenden Ausdruck:

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

dh:

using System.Text.RegularExpressions;

Regex r = new Regex("^[a-zA-Z0-9]*$");
if (r.IsMatch(SomeString)) {
  ...
}
Cletus
quelle
Wie wäre es mit Javascript, das gleiche, was ich denke?
Mrblah
4
Wenn Sie Datenbanknamen oder ähnliches intern bereinigen, ist es Ihnen egal, ob es nicht im englischsprachigen Land ausgeführt wird.
Ognyan Dimitrov
15
Ich verabscheue reguläre Ausdrücke. Ich weiß, dass ich mich nie an die Syntax erinnern werde. Selbst wenn ich es studiere, wird es bald eine Zeit geben, in der alles wieder vergessen ist.
Sentinel
1
@Phil. Vielleicht, aber bis dahin werde ich an jemanden delegieren, der reguläre Ausdrücke kennt ;-)
Sentinel
3
Es wurde gesagt: "Wenn Sie ein Problem mit regulären Ausdrücken lösen, haben Sie zwei Probleme."
O. Jones
205

In .NET 4.0 können Sie LINQ verwenden:

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

yourText.Allstoppt die Ausführung und gibt falsedie ersten char.IsLetterOrDigitBerichte zurück, falseda der Vertrag von Alldann nicht erfüllt werden kann.

Hinweis! Diese Antwort überprüft nicht unbedingt die alphanumerischen Zeichen (normalerweise AZ, az und 0-9). Diese Antwort erlaubt lokale Zeichen wie åäö.

Update 2018-01-29

Die obige Syntax funktioniert nur, wenn Sie eine einzelne Methode verwenden, die ein einzelnes Argument des richtigen Typs enthält (in diesem Fall char).

Um mehrere Bedingungen zu verwenden, müssen Sie wie folgt schreiben:

if (yourText.All(x => char.IsLetterOrDigit(x) || char.IsWhiteSpace(x)))
{
}
jgauffin
quelle
1
Ich wäre überrascht, wenn es nicht viel schneller geht. Kein Regex zum Kompilieren oder Auswerten, nur ein einfacher Vergleich.
Jgauffin
3
Das ist einfach schön, schlicht und einfach.
Sentinel
3
Wird dies nicht scheitern, wenn Sie sicherstellen möchten, dass Ihr Text definitiv alphanumerisch ist? Es können entweder alle Ziffern oder alle Alphabete sein, aber dennoch diese Bedingung erfüllen.
Itsbalur
2
@itsbalur: Ja, aber das war nicht die Frage.
Jgauffin
2
Ich denke, diese Antwort ist einfach falsch, vorausgesetzt, die alphanumerische Menge ist AZ, az und 0-9, da dies den gesamten Bereich der Unicode-Buchstaben und -Ziffern abdeckt, einschließlich nicht-lateinischer Zeichen. char.IsLetterOrDigit('ก')Wird zum Beispiel zurückkehren true. csharppad.com/gist/f96a6062f9f8f4e974f222ce313df8ca
tia
34

Sie könnten es leicht mit einer Erweiterungsfunktion anstelle eines regulären Ausdrucks tun ...

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

Per Kommentar :) ...

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

    return (str.ToCharArray().All(c => Char.IsLetter(c) || Char.IsNumber(c)));
}
JP Alioto
quelle
2
Es mag Geschmackssache sein, aber ich würde die Schleife als "foreach (char c in str) {...}" ausdrücken. Ob eine leere Zeichenfolge als OK betrachtet werden soll, hängt von der Anwendung ab, daher würde ich dies herausnehmen. Ich würde auch nicht 6 leere Zeilen in eine so triviale Routine einfügen, aber ich denke, das ist C # / Java / C ++ - die Codierer scheinen von Bildschirmimmobilien bezahlt zu werden. Auf jeden Fall ist dies die richtige Richtung, also +1.
Svante
3
Ich würde denken, wir möchten in dieser Situation IsDigit anstelle von IsNumber verwenden - IsNumber gibt true für Ziffern oder für Dinge zurück, die wie Zahlen aussehen (Brüche, römische Ziffern usw.; Siehe msdn.microsoft.com/). en-us / library / yk2b3t2y.aspx ). Angesichts dessen und wenn man sich besonders böse fühlt, kann man den Inhalt von IsAlphaNum noch weiter komprimieren: return string.IsNullOrEmpty (str)? false: str.ToCharArray (). All (Char.IsLetterOrDigit);
Stapel
4
Beachten Sie, dass Char.IsLetter für andere "Buchstaben" als a-zA-Z als wahr ausgewertet wird. Beispielsweise werden Japanisch あ, Chinesisch 的, Koreanisch 한 usw. als Unicode- "Buchstaben" betrachtet. Wenn dies Ihre Absicht ist, dann ist das in Ordnung, aber nach den verschiedenen regulären Ausdrücken in den anderen Antworten zu urteilen, ist dies wahrscheinlich nicht das, was am meisten als Alpha [numerisch] angesehen wird.
Dono
In meinem Fall brauchte ich neben IsLetter und IsNumber auch IsWhiteSpace, also habe ich es in Ihren Code eingefügt und es hat perfekt funktioniert!
Ben Junior
Verwenden Sie char.IsLetterOrDigitstattdessen IsLetter + IsNumber
nick_n_a
17

Während ich denke, dass die Regex-basierte Lösung wahrscheinlich der richtige Weg ist, wäre ich versucht, dies in einem Typ zusammenzufassen.

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

Wenn Sie jetzt eine validierte Zeichenfolge benötigen, kann für die Methodensignatur ein AlphaNumericString erforderlich sein, und Sie wissen, dass eine gültige Zeichenfolge gültig ist (abgesehen von Nullen). Wenn jemand versucht, eine nicht validierte Zeichenfolge zu übergeben, wird ein Compilerfehler generiert.

Sie können schicker werden und alle Gleichheitsoperatoren implementieren oder eine explizite Umwandlung in AlphaNumericString aus einer einfachen alten Zeichenfolge, wenn Sie möchten.

Kyoryu
quelle
Ich habe diesen Ansatz noch nie gesehen, aber ich mag die Klarheit der Absichten und Ihre Rechtfertigung. +1.
Cory House
1
Das ist neu für mich. Ich versuche den static public implicit operator stringTeil zu verstehen
Hassan Gulzar
8

Ich musste nach AZ suchen, az, 0-9; ohne Regex (obwohl das OP nach Regex fragt).

Hier werden verschiedene Antworten und Kommentare sowie Diskussionen von https://stackoverflow.com/a/9975693/292060 kombiniert , um Buchstaben oder Ziffern zu testen, andere Sprachbuchstaben zu vermeiden und andere Zahlen wie Bruchzeichen zu vermeiden.

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

^\w+$ erlaubt a-zA-Z0-9_

Verwenden Sie ^[a-zA-Z0-9]+$diese Option, um den Unterstrich zu verbieten.

Beachten Sie, dass für beide die Zeichenfolge nicht leer sein muss. Die Verwendung von *anstelle von +erlaubt leere Zeichenfolgen.

Peter Boughton
quelle
Wie könnte ich Ihr ^ \ w + $ ändern, um auch das "-" Bindestrichzeichen zuzulassen?
Neal Davis
@NealDavis^[\w-]+$
Zachafer
2

Um zu überprüfen, ob die Zeichenfolge sowohl eine Kombination aus Buchstaben als auch Ziffern ist, können Sie die Antwort @jgauffin mit .NET 4.0 und LINQ wie folgt neu schreiben:

if(!string.IsNullOrWhiteSpace(yourText) && 
yourText.Any(char.IsLetter) && yourText.Any(char.IsDigit))
{
   // do something here
}
Thabiso Mofokeng
quelle
Dies wird falsch Zeichenfolge erkennen, die andere Zeichen zusammen mit alphanumerischen ...
nsimeonov
1

Gleiche Antwort wie hier .

Wenn Sie eine Nicht-Regex-ASCII- A-z 0-9Prüfung wünschen , können Sie diese nicht verwenden, char.IsLetterOrDigit()da dies andere Unicode-Zeichen enthält.

Sie können die Zeichencodebereiche überprüfen.

  • 48 -> 57 sind Zahlen
  • 65 -> 90 sind Großbuchstaben
  • 97 -> 122 sind Kleinbuchstaben

Das Folgende ist etwas ausführlicher, dient jedoch eher dem besseren Verständnis als dem Code-Golf.

    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;
    }
Douglas Gaskell
quelle
0

Basierend auf der Antwort von cletus können Sie eine neue Erweiterung erstellen.

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);
    }
}
Alexa Adrian
quelle
-8

Ich rate, sich nicht auf fertigen und eingebauten Code in .NET Framework zu verlassen, sondern eine neue Lösung aufzurufen. Dies ist, was ich tue.

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;
}
Mahdi Al Aradi
quelle
2
Könnten Sie bitte eine Erklärung zu Ihrem Code hinzufügen, nur Dumping-Code ist hier im Allgemeinen verpönt
Draken
Sie fragten auch nach regulären Ausdrücken, dies sind keine regulären Ausdrücke
Draken
Vielen Dank für Kommentar und Beobachtung. Wie ich geraten habe, habe ich meinen eigenen Ansatz, um Code zu schreiben.
Mahdi Al Aradi
5
Ihr Kommentar, dass Sie sich in .Net nicht auf vorgefertigten Code verlassen sollen, macht wenig Sinn. Wenn Sie sich nicht auf vorgefertigten Code verlassen sollten, sollten Sie die char.IsNumber()Methode nicht verwenden , da dies vorgefertigter Code ist.
Draken
4
Dieser Code ist ein großartiges Beispiel dafür, warum es so schlecht ist, ihn selbst neu zu erfinden - er macht eigentlich nicht das, was Sie wollten! (Die Zeichenfolge "@ 1a" gibt falsch true zurück, die Zeichenfolge "a" gibt false zurück)
Flexo