2008-10-19 15 views
11

Używam następujące regex do przechwytywania stałej szerokości pola „Opis”, które jest zawsze 50 znaków:trymowania białe znaki od środku ciąg

(?.{50}) 

Moim problemem jest to, że czasami opisy zawierają dużo białych znaków, np

"FLUID  COMPRESSOR       " 

Może ktoś dostarczyć regex że:

  1. przyciąć wszystkie spacje z końca
  2. Zwija wszystkie spacje w między słowami do pojedynczym odstępem

Odpowiedz

15

zastępcze dwa lub więcej miejsc dla jednej przestrzeni:

s/ +/ /g 

EDIT: dla dowolnej białej przestrzeni (nie tylko obowiązuje), można użyć \ s jeśli używasz regex biblioteki Perl-kompatybilne, a nawias klamrowy na liczbę wystąpień, np

s/\s\s+/ /g 

lub

s/\s{2,}/ /g 

Edit # 2: zapomniałem/g globalny przyrostek, dzięki JL

+1

lub nawet tylko s/\ s +// g - od czasu do czasu mapuje pojedynczą przestrzeń na inną pojedynczą przestrzeń, ale nie ma to większego znaczenia. Ale globalny sufiks ma oczywiście znaczenie. –

+0

Niestety wszystkie proponowane wyrażenia końcowe pozostawiają jedną spację na końcu, jeśli była tam w początkowym łańcuchu. –

+0

Dobrze, ale czy istnieje jedno wyrażenie regularne, które może zrobić jedno i drugie? –

1

Czy istnieje szczególny powód, dla którego prosisz o wyrażenie regularne? Mogą nie być najlepszym narzędziem do tego zadania.

Zamiennik jak

s/[ \t]+/ /g 

należy ścisnąć spacje wewnętrzną (faktycznie, to skompresować początkowe i końcowe spacje też, ale to nie brzmi jak to jest problem.) I

s/[ \t]+$/$/ 

zajmie się spływem białych znaków. [Używam tutaj składni ish. sed. Nie powiedziałeś, jaki preferujesz.]


Od ręki nie widzę sposobu, aby zrobić to jednym zdaniem.

+0

Używam tego wnętrza większej wyrażenie regularne, z http://stackoverflow.com/questions/162727/read-fixed-width-record-from-text-file –

2

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

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

Bravo! To wyrażenie poprawnie przetwarza spacje między słowami i na końcu łańcucha. –

+0

To samo co zamierzałem zasugerować. :) –

1

Od kompresji spacje i przycinanie odstępy na brzegach są koncepcyjnie różne operacje, lubię to robić w dwóch etapach:

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

Nie jest to najbardziej skuteczny, ale dość czytelny.

0

/(^ [\ s \ n] + | [\ s \ n] + ([\ s \ t] | $))/g wymienić $ 2 (początek | środkowy/koniec)

2

C# :

Tylko jeśli chcesz przyciąć wszystkie białe przestrzenie - na początku, końcu i środku.

 string x = Regex.Replace(x, @"\s+", " ").Trim(); 
Powiązane problemy