Regulärer Ausdruck, um Leerzeichen zwischen Wörtern zuzulassen

187

Ich möchte einen regulären Ausdruck, der Symbole verhindert und nur Buchstaben und Zahlen zulässt. Die unten stehende Regex funktioniert hervorragend, lässt jedoch keine Leerzeichen zwischen Wörtern zu.

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

Wenn Sie beispielsweise diesen regulären Ausdruck verwenden, ist "HelloWorld" in Ordnung, aber "Hello World" stimmt nicht überein.

Wie kann ich es optimieren, um Leerzeichen zuzulassen?

lawphotog
quelle

Antworten:

366

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 ...

... benutze die Antwort von @ stema .

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, \wund \snicht 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 istAber 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 .

Andrew Cheong
quelle
3
es erlaubt leere Zeichenfolge
Neha Choudhary
1
Wow, so einfach! Vielen Dank. Gibt es nicht eine Site oder etwas, das man verwenden kann, um Regex-Ausdrücke zu generieren, für Noobs meine ich ...
Pierre
1
@Pierre - Es ist ziemlich schwierig, menschliche Anweisungen in explizite Regeln umzuwandeln. (Die menschliche Sprache ist fließend und voller Zweideutigkeiten, und unser Gehirn erledigt den größten Teil der Arbeit, die erforderlich ist, um Dinge zu lösen und Lücken zu schließen. Computer haben kein solches Gehirn, und kluge Versuche, eines nachzuahmen, sind noch nicht mächtig genug. ) Es gibt Tools wie debuggex.com , die Ihren regulären Ausdruck visuell darstellen, aber so ansprechend er auch ist, er ist für Anfänger möglicherweise nicht sehr hilfreich. Ich empfehle jedoch ein interaktives Tutorial , um die Grundlagen zu vermitteln.
Andrew Cheong
1
Ja, auch Ihre Regex stimmt überein, wenn nur Leerzeichen vorhanden sind. Meine Antwort war auf Neha Choudarys Kommentar.
Rajshekar Reddy
1
@Pierre Drei Jahre später - Ich bin heute auf diese Frage gestoßen und habe Ihren Kommentar gesehen. Ich benutze Regex Hero ( regexhero.net ) zum Testen von regulären Ausdrücken. Ich denke, die Online-Version funktioniert nur in Internet Explorer mit Silverlight, aber es ist besser als nichts.
Michael Armes
120

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 \wdies verwenden, ist in den meisten Regex-Geschmacksrichtungen das gleiche wie [a-zA-Z0-9_](in einigen ist es Unicode-basiert)

^\w+( \w+)*$

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 überein

Stema
quelle
Dies: regex101.com/#javascript bietet auch eine gute Erklärung für das Regex-Muster, das Sie analysieren möchten.
Dark Star1
Netter Regex, viel einfacher als viele [0-9a-z] usw.
George
24

Dieser hat für mich gearbeitet

([\w ]+)
Mario Rugeles Perez
quelle
1
Dieser Antwort fehlt eine Erklärung.
Mickmackusa
11

Versuche es mit:

^(\w+ ?)*$

Erläuterung:

\w             - alias for [a-zA-Z_0-9]
"whitespace"?  - allow whitespace after word, set is as optional
hsz
quelle
2
Dies wird so dazu führen, dass die Hölle zurückverfolgt wird.
nhahtdh
1
Bei einer nicht übereinstimmenden Zeichenfolge ggggggggggggggggggggggggggggggggggggg;wird es beispielsweise sehr lange dauern, bis Ihre Regex aufgrund übermäßiger Rückverfolgung das Ergebnis erreicht.
nhahtdh
Ok, was schlagen Sie vor?
Hsz
7

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:

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

oder wenn Sie eine Perl-ähnliche Syntax verwenden:

^\w[\w ]*\w$

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:

^(\w[\w ]*\w)?$

Wenn Sie nur einzelne Leerzeichen zulassen möchten, sieht es etwas anders aus:

^((\w+ )*\w+)?$

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.

creinig
quelle
Platz und \ssind nicht gleichwertig. \spasst mehr als nur Platz.
nhahtdh
@nhahtdh: Danke für den Kommentar. Ich bin es im Allgemeinen zu gewohnt, Leerzeichen abzugleichen. Die Antwort ist behoben.
creinig
Ist es möglich, dass Ihnen im ersten Ausdruck eine schließende Klammer fehlt? Ich bin mir nicht sicher, ob ich es nicht versucht habe.
ssinfod
@ssinfod: Guter Fang. Tatsächlich ist die öffnende Klammer in diesem Beispiel überflüssig. Vielen Dank.
Creinig
3

Dieser reguläre Ausdruck

^\w+(\s\w+)*$

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:

  1. ^ Position am Anfang der Zeichenfolge festlegen
  2. \w+ Entspricht einem beliebigen Wortzeichen [a-zA-Z0-9_]
    1. Quantifizierer: +Zwischen ein und unbegrenzt oft, so oft wie möglich, nach Bedarf zurückgeben [gierig]
  3. 1. Erfassungsgruppe (\s\w+)*
    1. Quantifizierer: *Zwischen null und unbegrenzt, so oft wie möglich, nach Bedarf zurückgeben [gierig]
    2. \s Entspricht einem beliebigen Leerzeichen [\r\n\t\f ]
    3. \w+ Entspricht einem beliebigen Wortzeichen [a-zA-Z0-9_]
      1. Quantifizierer: +Zwischen ein und unbegrenzt oft, so oft wie möglich, nach Bedarf zurückgeben [gierig]
  4. $ Position am Ende der Zeichenfolge festlegen
Amadeus Sánchez
quelle
2

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.

\w+.*$
jaxxbo
quelle
Diese Antwort ist falsch / ungenau. Dieses Muster entspricht einem oder mehreren alphanumerischen Unterstrichen und dann null oder mehr von Nicht-Zeilenumbrüchen. Nicht gut für das OP.
Mickmackusa
2

Nur für Alphabete:

^([a-zA-Z])+(\s)+[a-zA-Z]+$

Für alphanumerischen Wert und _:

^(\w)+(\s)+\w+$
bibliophilsagar
quelle
1
es ist kein gutes Beispiel, weil (etwas) + nicht dasselbe ist wie (etwas +). Im ersten Beispiel wird nur ein einzelnes Zeichen als $ 1 erfasst.
Znik
0

Versuchen Sie Folgendes: (Python-Version)

"(A-Za-z0-9 ){2, 25}"

Ändern Sie die Obergrenze basierend auf Ihrem Datensatz

MoMo
quelle
0

Fügen Sie am Ende Ihres Regex-Musters wie folgt ein Leerzeichen hinzu:

[a-zA-Z0-9_ ]
KayV
quelle
-1

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 .

^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$

So leicht zu alphanumerisch modifiziert:

^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$

(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.

LokizFenrir
quelle
3
[(?<=\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.
Alan Moore
An Upvoter: Bitte stimmen Sie keine falschen Lösungen ab. Sie verwirren andere Benutzer und lassen sie glauben, dass Regex Dinge tun kann, die es nicht tut.
Wiktor Stribiżew
-1

Ich finde, dass dies gut für einen "FullName" funktioniert:

([a-z',.-]+( [a-z',.-]+)*){1,70}/
Adam K Dean
quelle
-4

Versuchen .*? Leerzeichen zuzulassen hat bei mir funktioniert

user4035152
quelle
Das liegt daran ., dass alles passt. Dies ist hier sehr wahrscheinlich nicht die Lösung.
Rubik
Es entspricht null oder beliebigen Zeichen, abhängig davon, was vor und nach dieser Sequenz steht. Dies wird so wenig wie möglich entsprechen. Ein einzelner Punkt steht für ein einzelnes Zeichen.
Znik