it-swarm.com.de

Regulärer Ausdruck zum Ausschließen von Sonderzeichen

Ich habe Probleme, einen regulären Ausdruck zu finden, der bestimmte Sonderzeichen im Wesentlichen auf die schwarze Liste setzt.

Ich muss dies verwenden, um Daten in Eingabefeldern (in einer Java-Webanwendung) zu überprüfen. Wir möchten Benutzern die Eingabe einer beliebigen Ziffer, eines Buchstabens (wir müssen akzentuierte Zeichen, z. B. Französisch oder Deutsch) und einige Sonderzeichen wie "-" eingeben. usw. 

Wie kann ich Zeichen wie <>% $ usw. auf die schwarze Liste setzen?

Jede Hilfe wäre sehr dankbar. 

29
Ana

Ich würde nur die Zeichen auflisten.

^[a-zA-Z0-9äöüÄÖÜ]*$

Das Erstellen einer schwarzen Liste ist mit regex genauso einfach, aber Sie müssen möglicherweise viel mehr Zeichen hinzufügen - es gibt viele chinesische Symbole in Unicode ...;)

^[^<>%$]*$

Der Ausdruck [^ (hier viele Zeichen)] entspricht nur einem Zeichen, das nicht aufgeführt ist.

36

Um bestimmte Zeichen (<,>,% und $) auszuschließen, können Sie einen regulären Ausdruck wie folgt erstellen:

[<>%\$]

Dieser reguläre Ausdruck stimmt mit allen Eingaben überein, die ein Blacklist-Zeichen enthalten. Die Klammern definieren eine Zeichenklasse und das\ist vor dem Dollarzeichen erforderlich, da das Dollarzeichen in regulären Ausdrücken eine besondere Bedeutung hat.

Um weitere Zeichen zur schwarzen Liste hinzuzufügen, fügen Sie sie einfach zwischen die Klammern ein. Reihenfolge spielt keine Rolle.

Gemäß einiger Java-Dokumentation für reguläre Ausdrücke können Sie den Ausdruck folgendermaßen verwenden:

Pattern p = Pattern.compile("[<>%\$]");
Matcher m = p.matcher(unsafeInputString);
if (m.matches())
{
    // Invalid input: reject it, or remove/change the offending characters.
}
else
{
    // Valid input.
}
7
David Grayson

Es ist in der Regel besser, Zeichen, die Sie zulassen, in die Whitelist aufzunehmen, als Zeichen, die Sie nicht zulassen. sowohl unter Sicherheitsgesichtspunkten als auch unter dem Gesichtspunkt der einfachen Implementierung.

Wenn Sie die Blacklist-Route hinuntergehen, finden Sie hier ein Beispiel, aber seien Sie gewarnt, die Syntax ist nicht einfach.

http://groups.google.com/group/regex/browse_thread/thread/0795c1b958561a07

Wenn Sie alle Akzentzeichen auf die Whitelist setzen möchten, wäre die Verwendung von Unicode-Bereichen möglicherweise hilfreich. Schauen Sie sich diesen Link an.

http://www.regular-expressions.info/unicode.html

5
Jason Coyne

Ich denke, es hängt davon ab, auf welche Sprache Sie abzielen. Im Allgemeinen sollte so etwas funktionieren:

[^<>%$]

Das Konstrukt "[]" definiert eine Zeichenklasse, die mit einem der aufgelisteten Zeichen übereinstimmt. Wenn Sie "^" als erstes Zeichen angeben, wird die Übereinstimmung negiert, d. H. Jedes andere Zeichen als eines der aufgelisteten.

Abhängig von der verwendeten Sprache/Regex-Engine müssen Sie möglicherweise einige der Zeichen in "[]" mit Escapezeichen versehen.

4
KarstenF

Selbst im Jahr 2009 hatten zu viele den Eindruck, dass nur sehr wenige davon wussten, an welchem ​​Design für das WORLDWIDE-Web beteiligt war. Wenn nicht für ein bestimmtes Land entworfen wird, ist im Jahr 2015 die Sperrliste die einzige Möglichkeit, die große Anzahl von Zeichen zu berücksichtigen, die möglicherweise gültig sind.

Die Zeichen für die Blacklist müssen dann entsprechend dem für den Zweck, für den die Daten erforderlich sind, ungültig sind.

Manchmal lohnt es sich jedoch, die Anforderungen aufzuschlüsseln und einzeln zu behandeln. Hier ist Vorausschau dein Freund. Dies sind Abschnitte, die durch (?=) für Positiv und (?!) für Negativ begrenzt sind, und werden zu UND-Blöcken. Wenn der Block verarbeitet wird, wird der Regex-Prozessor, wenn er nicht ausgefallen ist, am Anfang des Textes mit dem nächsten Block beginnen. Tatsächlich wird jedem Look-Ahead-Block der ^ vorangestellt, und wenn sein Muster gierig ist, schließen Sie bis zum $ ein. Sogar die alte VB6/VBA (Office) 5.5-Regex-Engine unterstützt Look-Ahead.

Um einen vollständigen regulären Ausdruck aufzubauen, beginnen Sie mit den Look-Ahead-Blöcken und fügen dann den auf der schwarzen Liste befindlichen Zeichenblock vor dem abschließenden $ hinzu.

Um beispielsweise die Gesamtzahl der Zeichen, z. B. zwischen 3 und 15, zu begrenzen, beginnen Sie mit dem positiven Look-Ahead-Block (?=^.{3,15}$). Beachten Sie, dass dies einen eigenen ^ und $ benötigt, um sicherzustellen, dass der gesamte Text abgedeckt wird.

Während Sie _ und - zulassen möchten, möchten Sie möglicherweise nicht mit ihnen beginnen oder enden. Fügen Sie also die beiden negativen Look-Ahead-Blöcke (?![_-].+) für Start und (?!.+[_-]$) für Ende hinzu.

Wenn Sie nicht mehrere _ und - wünschen, fügen Sie einen negativen Look-Ahead-Block von (?!.*[_-]{2,}) hinzu. Dies schließt auch _-- und -_-Sequenzen aus.

Wenn keine weiteren Look-Ahead-Blöcke vorhanden sind, fügen Sie den Blacklist-Block vor $ hinzu, z. B. [^<>[\]{\}|\\\/^~%# :;,$%?\0-\cZ]+, wobei der \0-\cZ Null- und Steuerzeichen ausschließt, einschließlich NL (\n) und CR (\r). Der endgültige + sorgt dafür, dass der gesamte Text gierig eingefügt wird.

Innerhalb der Unicode-Domäne gibt es möglicherweise andere Codepunkte oder Blöcke, die ebenfalls ausgeschlossen werden müssen, aber sicherlich viel weniger als alle Blöcke, die in eine Whitelist aufgenommen werden müssten.

Die ganze Regex von all dem wäre dann

(?=^.{3,15}$)(?![_-].+)(?!.+[_-]$)(?!.*[_-]{2,})[^<>[\]{}|\\\/^~%# :;,$%?\0-\cZ]+$

die Sie live auf https://regex101.com/ , für pcre (php), Javascript und Python-Regex-Engines überprüfen können. Ich weiß nicht, wo der Java-Regex in diesen Bereich passt, aber Sie müssen den Regex möglicherweise anpassen, um seine Eigenheiten zu berücksichtigen.

Wenn Sie Leerzeichen einfügen möchten, aber nicht _, tauschen Sie sie einfach überall in der Regex aus.

Die nützlichste Anwendung für diese Technik ist das pattern-Attribut für HTML-input-Felder, bei dem ein einzelner Ausdruck erforderlich ist, der für den Fehler "false" zurückgegeben wird. Dadurch wird das Feld ungültig. input:invalid css kann es markieren und das gesendete Formular stoppen.

3
Patanjali

Die negierte Menge von allem, was nicht alphanumerisch ist, und Unterstrich für ASCII - Zeichen: 

/[^\W]/g

Für die E-Mail- oder Benutzername-Überprüfung habe ich den folgenden Ausdruck verwendet, der 4 Standard-Sonderzeichen erlaubt - _. @ 

/^[[email protected]_a-z0-9]+$/gi

Für einen strengen alphanumerischen Ausdruck verwenden Sie bitte:

/^[a-z0-9]+$/gi

Test @ RegExr.com

2
mcgraw

Möchten Sie wirklich bestimmte Charaktere auf die schwarze Liste setzen oder die erlaubten Zeichen auf die Positivliste setzen?

Ich gehe davon aus, dass Sie letztere wirklich wollen. Dies ist ziemlich einfach (fügen Sie zusätzliche Symbole zur Whitelist in die [\-]-Gruppe hinzu):

^(?:\p{L}\p{M}*|[\-])*$

Bearbeiten: Das Muster wurde mit den Eingaben aus den Kommentaren optimiert

2
Lucero

Hier sind alle französisch akzentuierten Charaktere: .__

Ich würde eine Liste mit deutschen Akzentzeichen suchen. Es gibt nicht so viele. Sie sollten sie alle bekommen können. 

Für URLs I Ersetzen Sie Akzent-URLs wie folgt durch normale Buchstaben:

string beforeConversion = "àÀâÂäÄáÁéÉèÈêÊëËìÌîÎïÏòÒôÔöÖùÙûÛüÜçÇ’ñ";
string afterConversion = "aAaAaAaAeEeEeEeEiIiIiIoOoOoOuUuUuUcC'n";
for (int i = 0; i < beforeConversion.Length; i++) {

     cleaned = Regex.Replace(cleaned, beforeConversion[i].ToString(), afterConversion[i].ToString());
}

Es gibt wahrscheinlich einen effizienteren Weg, wohlgemerkt.

1
Armstrongest

Warum halten Sie Regex für das beste Werkzeug? Wenn Sie feststellen möchten, ob ein ungültiges Zeichen in einer Zeichenfolge enthalten ist, ist das Testen jedes Zeichens in einer Schleife sowohl einfacher als auch effizienter als das Erstellen eines regulären Ausdrucks.

1
DJClayworth

Verwende das hier 

^ (? = [a-zA-Z0-9 ~ @ # $ ^ () _ + = [] {} | \,.?: -] $) (?!. * [<> "") /; `%])

1
Dharmender Tuli

Ich vermute stark, dass es einfacher ist, eine Liste der Zeichen zu erstellen, die erlaubt sind, im Vergleich zu denen, die nicht erlaubt sind. Setzen Sie mich also als eine weitere Abstimmung für "Whitelist" ab.

0
BlairHippo