So suchen Sie nach Vorkommen von mehr als einem Leerzeichen zwischen Wörtern in einer Zeile

108

So suchen Sie nach Vorkommen von mehr als einem Leerzeichen zwischen Wörtern in einer Zeile

1. this is a line containing  2 spaces
2. this is a line containing   3 spaces
3. this is a line containing multiple spaces first  second   three   four

Alle oben genannten sind gültige Übereinstimmungen für diesen regulären Ausdruck. Welche Regex soll ich verwenden?

Sam
quelle
Versuchen Sie, aufeinanderfolgende Leerzeichen oder alle Leerzeichen in dieser Zeile zu überprüfen?
Sachin Shanbhag
aufeinanderfolgende Leerzeichen nicht alle Leerzeichen
Sam
1
Was genau meinst du mit "zwischen Wörtern"? In zwei Ihrer Beispiele gibt es mehrere Leerzeichen zwischen einem Wort und einer Ziffer. Was ist mit Interpunktion (möchten Sie beispielsweise mehrere Leerzeichen nach einem Punkt und vor dem nächsten Wort abgleichen)? Was ist mit Leerzeichen vor / nach dem letzten Zeichen in einer Zeile? Möchten Sie auch Tabs abgleichen? Was ist mit Zeilen, die nur aus Leerzeichen bestehen?
Tim Pietzcker
Leerzeichen zwischen "enthalten und 2", "enthalten und 3", "erste und zweite", "zweite und drei" ... Ja, ich möchte Leerzeichen nach einem Punkt und vor dem nächsten Wort abgleichen.
Sam

Antworten:

180
[ ]{2,}

SPACE (2 oder mehr)

Sie können auch überprüfen, ob vor und nach diesen Leerzeichen Wörter folgen. (keine anderen Leerzeichen wie Tabulatoren oder neue Zeilen)

\w[ ]{2,}\w

das gleiche, aber Sie können auch nur die Leerzeichen für Aufgaben wie das Ersetzen auswählen (erfassen)

\w([ ]{2,})\w

oder sehen Sie, dass es vor und nach Leerzeichen alles gibt, nicht nur Wortzeichen (außer Leerzeichen)

[^\s]([ ]{2,})[^\s]
AlexanderMP
quelle
1
\wbedeutet "Wortzeichen", dh alphanumerisch und unterstrichen, jedoch keine anderen Nicht-Leerzeichen. Verwenden Sie \S(Großbuchstaben S), um nach Nicht-Leerzeichen zu suchen . Außerdem stimmt die erste nur mit Zeilen überein, die zwei oder mehr Leerzeichen enthalten, und sonst nichts.
tdammers
Ich habe versucht, die Frage weiterzuentwickeln. Ich habe verstanden, dass ich das, was Sie gesagt haben \S, verpasst habe . Ich ziehe es einfach vor, mich bei solchen Funktionen nicht auf Groß- und Kleinschreibung zu verlassen. Es ist einfacher zu lesen.
AlexanderMP
1
Warum benutzt du überhaupt Anker? Er sucht nach Räumen, die irgendwo in den Linien eingebettet sind.
Tim Pietzcker
kein bestimmter Grund. Zuerst dachte ich, ich brauche sie, also zog ich sie den ganzen Prozess entlang. In der Tat haben Sie Recht, dass ich falsch bin, sie in diesem Fall zu verwenden. Ich werde meine Antwort sofort bearbeiten.
AlexanderMP
1
\w[ ]{2,}\wwird nicht übereinstimmen word.<2 spaces>more wordsoder eine Zeichenfolge, die vollständig aus Leerzeichen besteht. [^\s]([ ]{2,})[^\s]\wwird auf Zeilen fehlschlagen, die mit Leerzeichen oder Zeichenfolgen wie bla<2 spaces>.... beginnen
Tim Pietzcker
12

Einfache Lösung:

/\s{2,}/

Dies entspricht allen Vorkommen eines oder mehrerer Leerzeichen. Wenn Sie die gesamte Zeile abgleichen müssen, jedoch nur, wenn sie zwei oder mehr aufeinanderfolgende Leerzeichen enthält:

/^.*\s{2,}.*$/

Wenn die Leerzeichen nicht aufeinanderfolgend sein müssen:

/^(.*\s.*){2,}$/
tdammers
quelle
Das .*ist normalerweise gierig, was bedeutet, dass es das Ende der getesteten Zeichenfolge erreicht und alles, was folgt, wenn es obligatorische Zeichen gibt, nicht übereinstimmt. In der Regel in diesem Fall ist es eine gute Praxis hinzuzufügen ?, wie diese .*?. Es passierte mir mit PHPs PCRE
AlexanderMP
Es passt zusammen. "Gierig" bedeutet, dass es so gut wie möglich übereinstimmt, während das Muster als Ganzes erhalten bleibt. /^.*b.*$/stimmt tatsächlich überein "foobar", obwohl Sie erwarten würden, dass die erste Gier .*bereits mit der gesamten Zeichenfolge übereinstimmt.
tdammers
8

Diese Regex wählt alle Leerzeichen aus. Sie können diese verwenden und durch ein einzelnes Leerzeichen ersetzen

\s+

Beispiel in Python

result = re.sub('\s+',' ', data))
Owen Yuwono
quelle
4

Suche nach [ ]{2,}. Dadurch werden zwei oder mehr benachbarte Leerzeichen irgendwo innerhalb der Linie gefunden. Es werden auch führende und nachfolgende Leerzeichen sowie Linien abgeglichen, die vollständig aus Leerzeichen bestehen. Wenn Sie das nicht wollen, lesen Sie Alexanders Antwort.

Eigentlich können Sie die Klammern weglassen, sie dienen nur der Klarheit (ansonsten ist das Leerzeichen, das wiederholt wird, nicht so gut sichtbar :)).

Das Problem mit dem \s{2,}ist , dass es auch Zeilenumbrüche auf Windows - Dateien Übereinstimmen (wo neue Zeilen bezeichnet werden durch CRLFoder \r\ndie abgestimmt sind durch \s{2}.

Wenn Sie auch mehrere Tabulatoren und Leerzeichen suchen möchten, verwenden Sie [ \t]{2,}.

Tim Pietzcker
quelle
more than one space between words in a line. Wie ist [ ]{2,}zwischen Wörtern? Hast du die Frage überhaupt gelesen?
AlexanderMP
Aus diesem Grund habe ich auf Ihre Antwort verwiesen, falls das OP wirklich so streng sein möchte, wie er schreibt. Vielleicht sollten wir ihn fragen.
Tim Pietzcker
2

Hier ist meine Lösung

[^0-9A-Z,\n]

Dadurch werden alle Ziffern, Kommas und neuen Zeilen entfernt, aber der mittlere Bereich wie der Datensatz von wird ausgewählt

  • 20171106,16632 ESCG0000018SB
  • 20171107,280 ESCG0000018SB
  • 20171106,70476 ESCG0000018SB
Ojitha
quelle