Regex akzeptiert nur Alphabete und Leerzeichen und verbietet Leerzeichen am Anfang und Ende der Zeichenfolge

7

Ich habe folgende Voraussetzungen für die Validierung eines Eingabefeldes:

  1. Es sollte nur Alphabete und Leerzeichen zwischen den Alphabeten enthalten.
  2. Es darf keine Leerzeichen am Anfang oder Ende der Zeichenfolge enthalten.
  3. Es darf kein anderes Sonderzeichen enthalten.

Ich verwende folgende Regex dafür:

%Vor%

Aber das erlaubt Räume am Anfang. Jede Hilfe wird geschätzt.

    
gauravdott 22.05.2012, 08:49
quelle

5 Antworten

8

Für mich ist der einzige logische Weg, dies zu tun:

%Vor%

Am Anfang der Zeichenfolge muss mindestens ein Buchstabe stehen. (Ich habe Ihre [a-zA-Z] durch die Unicode-Code-Eigenschaft für die Buchstaben \p{L} ersetzt). Dann kann ein Leerzeichen folgen, gefolgt von mindestens einem Buchstaben, dieser Teil kann wiederholt werden.

\p{L} : jede Art von Buchstaben aus jeder Sprache. Siehe regulary-expressions.info

Das Problem in Ihrem Ausdruck ^(?!\s*$) ist, dass Lookahead fehlschlägt, wenn nur whitespace bis zum Ende der Zeichenfolge vorhanden ist. Wenn Sie führende Leerzeichen nicht zulassen möchten, entfernen Sie einfach das Ende des String-Ankers im Lookahead == & gt; %Code%. Dies erlaubt jedoch weiterhin, dass die Zeichenfolge mit Leerzeichen endet. Um dies zu vermeiden, schauen Sie zurück zum Ende der Zeichenkette ^(?!\s)[-a-zA-Z ]*$ . Aber ich denke, für diese Aufgabe braucht man sich nicht umzusehen.

    
stema 22.05.2012, 09:34
quelle
8

Dies sollte funktionieren, wenn Sie es mit String.matches Methode verwenden. Ich nehme an, Sie wollen Englisch Alphabet.

%Vor%

Beachten Sie, dass \s alle Arten von Leerzeichen erlaubt. In Java wäre dies äquivalent zu

%Vor%

Dazu gehören horizontale Registerkarte (09), Zeilenvorschub (10), Wagenrücklauf (13), Seitenvorschub (12), Rücktaste (08), Leerzeichen (32).

Wenn Sie ausdrücklich nur Platz (32) zulassen möchten:

%Vor%

Sie können die obige Regex weiter optimieren, indem Sie die erfassende Gruppe ( +[a-zA-Z]+) nicht erfassend machen (mit String.matches , die Sie nicht erhalten können Worte sowieso einzeln). Es ist auch möglich, die Quantifizierer so zu ändern, dass sie possessive sind, da es keinen Sinn hat, hier zurück zu laufen.

%Vor%     
nhahtdh 22.05.2012 08:53
quelle
1

Versuchen Sie Folgendes:

%Vor%

Dieser Ausdruck verwendet negatives Lookahead und negatives Lookbehind um Leerzeichen am Anfang oder am Ende der Zeichenfolge zu sperren und die Übereinstimmung der gesamten Zeichenfolge zu erfordern.

    
dasblinkenlight 22.05.2012 08:55
quelle
1

Ich denke, das Problem ist, dass es ein? vor der Negation von Leerzeichen, was bedeutet, dass es optional ist

Das sollte funktionieren:

%Vor%

mindestens eine Buchstabenfolge, dann optionale Zeichenfolge mit Leerzeichen, endet aber immer mit Buchstaben

    
Sigal Shaharabani 22.05.2012 09:10
quelle
1

Ich weiß nicht, ob Wörter in Ihrer akzeptierten Zeichenfolge durch mehr als ein Leerzeichen getrennt werden können. Wenn sie können:

%Vor%

Wenn nicht:

%Vor%

String muss mit Buchstaben (oder wenigen Buchstaben) beginnen, nicht mit Leerzeichen.

String kann wenige Wörter enthalten, aber jedes Wort neben dem ersten muss Leerzeichen davor enthalten.

Ich hoffe, ich habe geholfen.

    
Pshemo 22.05.2012 11:48
quelle

Tags und Links