Regex-Skriptvalidierung in Kleinbuchstaben

Regex-Skriptvalidierung in Kleinbuchstaben

Ich arbeite an einer Hausaufgabe, um zu überprüfen, ob eine eingegebene Zeichenfolge vollständig aus Kleinbuchstaben besteht. Hier ist das grundlegende Skript, das uns zur Verfügung gestellt wird.

Hier ist die Zeile, die ich ändern muss.

if [[ "$input" =~ Add your regular expression here ]]

Wenn ich [a-z]irgendetwas eingebe, das nur einen Kleinbuchstaben enthält, wird es validiert. Bei [[:lower:]]„Brian“ wird es validiert und bei „cats“ nicht, aber Kauderwelsch wie z. B. trhrhist in Ordnung. Ich kenne den hier zu verwendenden regulären Ausdruck nicht. Ich wäre für jede Hilfe sehr dankbar.

Antwort1

Testen Sie, ob die Zeichenfolge etwas enthält, dasnichtein Kleinbuchstabe.

if [[ "$input" =~ [^[:lower:]] ]]; then
    # contains something that is not a lower case letter
else
    # contain only lower case letters
fi

oder,

if ! [[ "$input" =~ [^[:lower:]] ]]; then
    # contain only lower case letters
fi

Das ^am Anfang eines eingeklammerten Ausdrucks kehrt den Sinn der Übereinstimmung um, so dass [^abc]jedes einzelne Zeichen übereinstimmt, dasnicht a, b, oder c.

Alternativ können Sie die gesamte Länge der Zeichenfolge anpassen, indem Sie die Zeichenfolge an beiden Enden verankern:

if [[ "$input" =~ ^[[:lower:]]+$ ]]; then
    # contain only lower case letters
fi

Das ^am Anfang des Ausdrucks verankert nur am Anfang der Zeichenfolge, während das $am Ende am Ende der Zeichenfolge verankert ist. Dazwischen erlauben wir mit nur Kleinbuchstaben [[:lower:]]+, also einen oder mehrere Kleinbuchstaben. Die Verwendung *von anstelle von +würde es dem Ausdruck ermöglichen, auch mit einer leeren Zeichenfolge erfolgreich übereinzustimmen.

Beachten Sie auch den Unterschied zwischen [[:lower:]](entspricht einem einzelnen Kleinbuchstaben) und [:lower:]entspricht einem der Zeichen :, l, o, w, e, oder r). In der ursprünglichen Frage sagten Sie, dass Brianmit übereinstimmte, [:lower:]während catsdies nicht der Fall war, was jetzt Sinn ergeben sollte. In einer Bearbeitung haben Sie den Ausdruck in das richtige geändert [[:lower:]]und catssollten jetzt auch übereinstimmen.


Mit einem Globbing-Match für die reguläre Ausdrucksübereinstimmung:

if [[ "$input" == *[![:lower:]]* ]]; then
    # contains something that is not a lower case letter
else
    # contain only lower case letters
fi

In einem Globbing-Muster !funktioniert der Anfang eines eingeklammerten Ausdrucks genauso wie ^im Fall eines regulären Ausdrucks (obwohl ich glaube, dass dies bashauch ^in Globbing-Mustern erkannt wird).

Antwort2

Sie können auch mit diesem OneLiner nachsehen, wenn Sie möchten:

echo "$input" | grep -qE '^[[:lower:]]*$' && echo "All LowerCase" || echo "Not All LowerCase"

verwandte Informationen