tl; dr
Fügen Sie einfach ein Leerzeichen in Ihre Charakterklasse ein .
^[a-zA-Z0-9_ ]*$
Nun, wenn Sie streng sein wollen ...
Das obige ist nicht genau richtig. Aufgrund der Tatsache, dass *
dies null oder mehr bedeutet , würde es allen folgenden Fällen entsprechen, die normalerweise nicht übereinstimmen würden:
- Eine leere Zeichenfolge, "".
- Eine Zeichenfolge, die ausschließlich aus Leerzeichen besteht.
- Eine Zeichenfolge, die mit Leerzeichen führt und / oder verfolgt, "Hello World".
- Eine Zeichenfolge, die mehrere Leerzeichen zwischen den Wörtern "Hello World" enthält.
Ursprünglich dachte ich nicht, dass es sich lohnt, auf solche Details einzugehen, da OP eine so grundlegende Frage stellte, dass es so schien, als sei Strenge kein Problem. Jetzt, da die Frage jedoch an Popularität gewonnen hat, möchte ich sagen ...
Was in meinem Geschmack (ohne Verwendung \w
) bedeutet:
^[a-zA-Z0-9_]+( [a-zA-Z0-9_]+)*$
(Bitte stimmen Sie @stema trotzdem zu.)
Einige Dinge, die Sie zu dieser Antwort (und zu @ stema) beachten sollten:
Wenn Sie mehrere Leerzeichen zwischen Wörtern zulassen möchten (z. B. wenn Sie versehentliche doppelte Leerzeichen zulassen möchten oder wenn Sie mit kopiertem Text aus einer PDF-Datei arbeiten), fügen Sie +
nach dem Leerzeichen ein Leerzeichen hinzu:
^\w+( +\w+)*$
Wenn Sie Tabulatoren und Zeilenumbrüche (Leerzeichen) zulassen möchten, ersetzen Sie das Leerzeichen durch \s+
:
^\w+(\s+\w+)*$
Hier schlage ich die +
Standardeinstellung vor, da beispielsweise Windows-Zeilenumbrüche aus zwei Leerzeichen in Folge bestehen \r\n
, sodass Sie +
beide Zeichen abfangen müssen.
Funktioniert immer noch nicht?
Überprüfen Sie, welchen Dialekt regulärer Ausdrücke Sie verwenden. * In Sprachen wie Java müssen Sie Ihren Backslashes entkommen, dh \\w
und \\s
. Bei älteren oder mehr Basissprachen und Dienstprogramme, wie sed
, \w
und \s
nicht definiert sind, so dass sie so schreiben , mit Charakterklassen, zB [a-zA-Z0-9_]
und [\f\n\p\r\t]
, respectively.
* Ich weiß, dass diese Frage markiert istvb.netAber basierend auf mehr als 25.000 Ansichten denke ich, dass nicht nur diese Leute auf diese Frage stoßen. Derzeit ist es der erste Treffer bei Google für den Suchbegriff, das Leerzeichen für reguläre Ausdrücke .
Eine Möglichkeit wäre, einfach das Leerzeichen in Ihre Zeichenklasse einzufügen, wie von acheong87 vorgeschlagen. Dies hängt davon ab, wie streng Sie in Ihrem Muster sind, da dies auch eine Zeichenfolge ermöglichen würde, die mit 5 Leerzeichen beginnt, oder Zeichenfolgen, die nur aus Leerzeichen bestehen.
Die andere Möglichkeit besteht darin, ein Muster zu definieren:
Ich werde
\w
dies verwenden, ist in den meisten Regex-Geschmacksrichtungen das gleiche wie[a-zA-Z0-9_]
(in einigen ist es Unicode-basiert)Dies ermöglicht eine Reihe von mindestens einem Wort und die Wörter werden durch Leerzeichen geteilt.
^
Passen Sie den Anfang der Zeichenfolge an\w+
Ordnen Sie eine Reihe von mindestens einem Wortzeichen zu( \w+)*
ist eine Gruppe, die 0 oder mehrmals wiederholt wird. In der Gruppe wird ein Leerzeichen erwartet, gefolgt von einer Reihe von mindestens einem Wortzeichen$
stimmt mit dem Ende der Zeichenfolge übereinquelle
Dieser hat für mich gearbeitet
quelle
Versuche es mit:
Erläuterung:
quelle
ggggggggggggggggggggggggggggggggggggg;
wird es beispielsweise sehr lange dauern, bis Ihre Regex aufgrund übermäßiger Rückverfolgung das Ergebnis erreicht.Ich gehe davon aus, dass Sie keinen führenden / nachfolgenden Platz wollen. Dies bedeutet, dass Sie den regulären Ausdruck in "erstes Zeichen", "Zeug in der Mitte" und "letztes Zeichen" aufteilen müssen:
oder wenn Sie eine Perl-ähnliche Syntax verwenden:
Außerdem: Wenn Sie Ihren regulären Ausdruck absichtlich so formuliert haben, dass er auch leere Zeichenfolgen zulässt, müssen Sie das Ganze optional machen:
Wenn Sie nur einzelne Leerzeichen zulassen möchten, sieht es etwas anders aus:
Dies entspricht 0..n Wörtern, gefolgt von einem einzelnen Leerzeichen plus einem Wort ohne Leerzeichen. Und macht das Ganze optional, um leere Zeichenfolgen zuzulassen.
quelle
\s
sind nicht gleichwertig.\s
passt mehr als nur Platz.Dieser reguläre Ausdruck
erlaubt nur ein einzelnes Leerzeichen zwischen Wörtern und keine führenden oder nachfolgenden Leerzeichen.
Nachfolgend finden Sie die Erklärung des regulären Ausdrucks:
^
Position am Anfang der Zeichenfolge festlegen\w+
Entspricht einem beliebigen Wortzeichen[a-zA-Z0-9_]
+
Zwischen ein und unbegrenzt oft, so oft wie möglich, nach Bedarf zurückgeben [gierig](\s\w+)*
*
Zwischen null und unbegrenzt, so oft wie möglich, nach Bedarf zurückgeben [gierig]\s
Entspricht einem beliebigen Leerzeichen[\r\n\t\f ]
\w+
Entspricht einem beliebigen Wortzeichen[a-zA-Z0-9_]
+
Zwischen ein und unbegrenzt oft, so oft wie möglich, nach Bedarf zurückgeben [gierig]$
Position am Ende der Zeichenfolge festlegenquelle
Dies lässt am Anfang keinen Platz. Erlaubt aber Leerzeichen zwischen Wörtern. Ermöglicht auch Sonderzeichen zwischen Wörtern. Eine gute Regex für die Felder Vorname und Nachname.
quelle
Nur für Alphabete:
Für alphanumerischen Wert und
_
:quelle
Versuchen Sie Folgendes: (Python-Version)
Ändern Sie die Obergrenze basierend auf Ihrem Datensatz
quelle
Fügen Sie am Ende Ihres Regex-Musters wie folgt ein Leerzeichen hinzu:
quelle
Ich habe mir viele dieser angeblichen Antworten genau angesehen ...
... und Bupkis nach dem Durchsuchen von Stack Overflow sowie anderen Sites nach einem regulären Ausdruck, der mit einer beliebigen Zeichenfolge ohne Start- oder nachfolgendem Leerzeichen und nur einem Leerzeichen zwischen rein alphanumerischen Wörtern übereinstimmt .
So leicht zu alphanumerisch modifiziert:
(Dies stimmt nicht mit einzelnen Wörtern überein, sondern verwendet nur einen Schalter / if-else mit einem einfachen,
^[a-zA-Z0-9]+$
wenn Sie zusätzlich einzelne Wörter abfangen müssen.)genießen: D.
quelle
[(?<=\d\s]
passt zu einem:(
,?
,<
,=
, eine Ziffer oder ein Leerzeichen, und das kann nicht sein , was Sie gemeint. Wenn es ein Lookbehind sein sollte(?<=\d\s)
, sollte es sein , aber es macht dort keinen Sinn; Die Regex würde niemals übereinstimmen.Ich finde, dass dies gut für einen "FullName" funktioniert:
quelle
Versuchen .*? Leerzeichen zuzulassen hat bei mir funktioniert
quelle
.
, dass alles passt. Dies ist hier sehr wahrscheinlich nicht die Lösung.