2008-10-19 14 views
11

ich die folgende regex bin mit einer festen Breite Feld „Beschreibung“ zu erfassen, die immer 50 Zeichen lang ist:Trim Leerzeichen aus Mitte der Zeichenfolge

(?.{50}) 

Mein Problem ist, dass die Beschreibungen manchmal enthalten lot von Leerzeichen, z

"FLUID  COMPRESSOR       " 

Kann jemand einen regulären Ausdruck zur Verfügung stellen, die:

  1. Borte alle Leerzeichen vom Ende
  2. alle Leerzeichen Einbrüche zwischen Wörtern zu einem einzigen Raum

Antwort

15

Ersatz zwei oder mehr Räume für einen Raum:

s/ +/ /g 

Edit: für jeden Leerraum (nicht nur Leerzeichen) Sie \ s nutzen können, wenn Sie eine Perl-kompatibelen Regex-Bibliothek und die geschweifte Klammer Syntax für die Anzahl der Vorkommen, z

s/\s\s+/ /g 

oder

s/\s{2,}/ /g 

Edit # 2: vergessen, die/g globale Suffix dank JL

+1

oder auch nur s/\ s +// g - es bildet gelegentlich einen einzelnen Raum auf einen anderen einzelnen Raum ab, aber es spielt kaum eine Rolle. Aber das globale Suffix spielt natürlich eine Rolle. –

+0

Leider lassen alle vorgeschlagenen Regex ein Leerzeichen am Ende, wenn es in der ursprünglichen Zeichenfolge vorhanden war. –

+0

Guter Punkt, aber gibt es einen einzigen Regex, der beides kann? –

1

Gibt es eine Aus welchem ​​Grund fordern Sie einen regelmäßigen Ausdruck? Sie sind möglicherweise nicht das beste Werkzeug für diese Aufgabe.

Ein Ersatz wie

s/[ \t]+/ /g 

sollte die internen Leerzeichen komprimieren (tatsächlich wird es komprimiert führende und auch nachfolgende Leerzeichen, aber es klingt nicht wie das ist ein Problem.) Und

s/[ \t]+$/$/ 

wird sich um die abschließenden Leerzeichen kümmern. [Ich verwende hier die sed ish-Syntax. Sie habe nicht gesagt, was Geschmack Sie bevorzugen.]


Rechts von Hand Ich sehe keinen Weg, um es in einem einzigen Ausdruck zu tun.

+0

Ich verwende diese innerhalb eines größeren regulären Ausdruck, von http://stackoverflow.com/questions/162727/read-fixed-width-record-from-text-file –

2

Perl-Varianten: 1) s/\ s + $ //; 2) s/\ s +// g;

9
str = Regex.Replace(str, " +(|$)", "$1"); 
+1

Bravo! Diese Regex verarbeitet Leerzeichen zwischen Wörtern und am Ende eines Strings. –

+0

Das gleiche würde ich vorschlagen. :) –

1

Da Leerzeichen Komprimieren und Trimmen Leerzeichen um die Kanten sind konzeptionell verschiedene Operationen, ich habe es in zwei Schritten gerne tun:

re.replace("s/\s+/ /g", str.strip()) 

nicht die effizienteste, aber gut lesbar.

0

/(^ [\ s \ t] + | [\ s \ t] + ([\ s \ t] | $))/g ersetzen mit 2 $ (beginnend | Mitte/Ende)

2

C# :

Nur wenn Sie alle weißen Räume trimmen wollen - am Anfang, Ende und Mitte.

 string x = Regex.Replace(x, @"\s+", " ").Trim(); 
Verwandte Themen