2013-05-02 13 views
32

Buduję ciąg nazwisk oddzielonych myślnikami. Czasami wpada tam biała plama. Muszę usunąć wszystkie białe spacje z wyniku końcowego.Usuń wszystkie spacje z ciągu C# z regex

Przykładowy łańcuch do pracy na:

Anderson -Reed-Smith

Trzeba skończyć jak (bez spacji po Anderson):

Anderson-Reed Smith

Łańcuch nazwy ostatniej zawiera ciąg znaków w stanie, LastName.

używam wyrażenia regularnego:

Regex.Replace(LastName, @"[\s+]", ""); 

Wynikiem tego jest:

Anderson -Reed-Smith.

Próbowałem również:

Regex.Replace(LastName, @"\s+", ""); 

i

Regex.Replace(LastName, @"\s", ""); 

Co robię źle?

+0

Nie trzeba regex jeśli nazwa jest jedynym danych w ciąg. W przeciwnym razie prawdopodobnie możesz użyć (- | - | -) – Evo510

Odpowiedz

114

Zamiast RegEx użytku Replace czegoś że prosta:

LastName = LastName.Replace(" ", String.Empty); 
+3

To. Chciałbym teraz głosować za tą odpowiedzią, ale osiągnąłem dzisiaj limit głosowania. – Renan

+1

Nie wiedziałem, że istnieje limit! –

+4

@Renan, wróć jutro i awansuj :) – Gabe

11

Nie ma potrzeby stosowania wyrażeń regularnych. Będzie to również usunąć zakładki, znaki nowej linii itp

var newstr = String.Join("",str.Where(c=>!char.IsWhiteSpace(c))); 

białe znaki znaków:0009 , 000a , 000b , 000c , 000d , 0020 , 0085 , 00a0 , 1680 , 180e , 2000 , 2001 , 2002 , 2003 , 2004 , 2005 , 2006 , 2007 , 2008 , 2009 , 200a , 2028 , 2029 , 202f , 205f , 3000.

+4

Masz problem. Chcesz go rozwiązać za pomocą wyrażenia regularnego. Teraz mam dwa problemy. Rozwiąż go za pomocą LINQ. Nadal dwa problemy :-) –

+1

@ JuliánUrbano Tak Regex może być problematyczne przy utrzymaniu, ale nie mogę powiedzieć tego samego dla Linq. – I4V

+1

@ JuliánUrbano, nigdy nie powinieneś * chcieć * niczego rozwiązywać, ponieważ jest to konkretny interfejs API. Na zbyt wiele pytań odpowiada na tej stronie odpowiedź LINQ, chociaż - w gruncie rzeczy - można ją rozwiązać znacznie łatwiej i znacznie szybciej. Wybierz najlepsze rozwiązanie. –

44

Regex.Replace nie modyfikuje swój pierwszy argument (Przypomnijmy, że ciągi są niezmienne w .NET), więc połączenia

Regex.Replace(LastName, @"\s+", ""); 

liście ciąg znaków LastName pozostaje niezmieniony. Musisz to tak nazwać:

LastName = Regex.Replace(LastName, @"\s+", ""); 

Wszystkie trzy wyrażenia regularne zadziałałyby. Jednak pierwszy regex usunąłby wszystkie znaki plusa, które, jak sobie wyobrażam, byłyby niezamierzone.

-1

Poniżej znajduje się kod, który zastąpi białą przestrzeń od nazwy pliku do podanego adresu URL, a także możemy usunąć to samo za pomocą ciągu znaków.pusty zamiast "~"

if (!string.IsNullOrEmpty(url)) 
      { 
      string origFileName = Path.GetFileName(url); 
      string modiFileName = origFileName.Trim().Replace(" ", "~"); 
      url = url.Replace(origFileName , modiFileName); 
      } 
      return url; 
+0

Op powiedział _ "Muszę usunąć wszystkie ** białe znaki **" _ i użyłem '\ s'. Ale to zajmuje tylko "" "przestrzeń i jest w większości niezwiązane. Natomiast 'Trim()' obsługuje tylko przestrzeń wiodącą i trailingującą. Nie widzę tego. –

-1

Dlaczego użyć wyrażenia regularnego, kiedy można po prostu użyć metody trim()

Text='<%# Eval("FieldDescription").ToString().Trim() %>' 

LUB

string test = "Testing "; 
test.Trim(); 
+2

Wymaga usunięcia wszystkich przestrzeni, nie tylko spacji i kończących –

0

Najszybsza i ogólny sposób to zrobić (line terminatory, zakładki będą również przetwarzane). Zdolne urządzenia Regex naprawdę nie potrzebują rozwiązania tego problemu, ale Regex może zmniejszyć wydajność.

     new string 
          (stringToRemoveWhiteSpaces 
           .Where 
           (
            c => !char.IsWhiteSpace(c) 
           ) 
           .ToArray<char>() 
          ) 

LUB

     new string 
          (stringToReplaceWhiteSpacesWithSpace 
           .Select 
           (
            c => char.IsWhiteSpace(c) ? ' ' : c 
           ) 
           .ToArray<char>() 
          )