2012-01-08 12 views
41

Come si rimuovono caratteri non alfanumerici da una stringa e si perdono spazi in C# con Sostituisci?Come si rimuovono caratteri non alfanumerici (compresi gli spazi) da una stringa?

Voglio mantenere a-z, A-Z, 0-9 e niente più (nemmeno "" spazi).

"Hello there(hello#)".Replace(regex-i-want, ""); 

dovrebbe dare

"Hellotherehello" 

Ho provato "Hello there(hello#)".Replace(@"[^A-Za-z0-9 ]", ""); ma gli spazi rimangono.

+1

Come definire prima cosa si intende esattamente per alfanumerico? Vuoi solo A-Z, a-z, 0-9? Unicode ha molte più lettere e numeri. – CodesInChaos

+2

Con quella modifica, sembra molto meglio - riprendendo il mio voto negativo. –

+1

Perché hai uno spazio nella staffa? E 'string.Replace' non prende un'espressione regolare in primo luogo. – CodesInChaos

risposta

55

Nella tua regex, si sono esclusi gli spazi da cui ci si allinea (e non è stato utilizzato Regex.Replace() che avevo trascurato completamente ...):

result = Regex.Replace("Hello there(hello#)", @"[^A-Za-z0-9]+", ""); 

dovrebbe funzionare. + rende l'espressione regolare un po 'più efficiente abbinando più di un carattere non alfanumerico consecutivo anziché uno alla volta.

Se si desidera mantenere le lettere non-ASCII/cifre, troppo, usa il seguente espressione regolare:

@"[^\p{L}\p{N}]+" 

che lascia

BonjourmesélèvesGutenMorgenliebeSchüler 

invece di

BonjourmeslvesGutenMorgenliebeSchler 
+0

Ho provato questo ... è molto vicino ma sembra lasciare degli spazi dentro - Li voglio anche spogliati! Grazie. – James

+0

No, non è così. A meno che non ci siano spazi speciali come lo spazio non interrompibile ASCII 160 (e la seconda versione rimuove correttamente anche quelli). –

+0

Hmmm ho provato la seguente: 't stringa = "ciao là - (efrwef)";' ' stringa a = "Nuovo:" + t.Replace (@" [^ \ p {} L \ p { N}] + "," ");' e finisce per essere "ciao lì - (efrwef)" - completamente invariato - so che sto facendo qualcosa di sbagliato qui. – James

-6

In .Net 4.0 è possibile utilizzare il metodo IsNullOrWhitespace della classe String per rimuovere i cosiddetti caratteri dello spazio bianco. Si prega di dare un'occhiata qui http://msdn.microsoft.com/en-us/library/system.string.isnullorwhitespace.aspx Tuttavia, come @CodeInChaos ha sottolineato ci sono un sacco di caratteri che potrebbero essere considerati come lettere e numeri. Puoi usare un'espressione regolare se vuoi solo trovare A-Za-z0-9.

+0

Fatti un favore e toglilo. –

3

Oppure si può fare anche questo:

public static string RemoveNonAlphanumeric(string text) 
    { 
     StringBuilder sb = new StringBuilder(text.Length); 

     for (int i = 0; i < text.Length; i++) 
     { 
      char c = text[i]; 
      if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') 
       sb.Append(text[i]); 
     } 

     return sb.ToString(); 
    } 

Usage:

string text = SomeClass.RemoveNonAlphanumeric("text LaLa (lol) á ñ $ 123 ٠١٢٣٤"); 

//text: textLaLalol123 
+1

Anche se mi piace l'approccio generale, non si adatta al requisito di consentire solo A-Z, a-z, 0-9. Permette anche altre lettere e cifre. – CodesInChaos

+0

@CodeInChaos hai ragione. corretto :) – Adrianne

+0

Anche in Unicode ci sono più di 10 cifre. '' sono alcuni esempi. – CodesInChaos

2

L'errore fatto sopra è stato utilizzando Sostituire in modo non corretto (non ci vuole regex, grazie CodeInChaos).

Il seguente codice dovrebbe fare ciò che è stato specificato:

Regex reg = new Regex(@"[^\p{L}\p{N}]+");//Thanks to Tim Pietzcker for regex 
string regexed = reg.Replace("Hello there(hello#)", ""); 

Questo dà:

regexed = "Hellotherehello" 
-2

Usa seguente espressione regolare per mettere a nudo i tutti i caratteri della stringa utilizzando Regex.Sostituire

([^A-Za-z0-9\s]) 
+0

'string.Replace()' non accetta regex come argomento – PostureOfLearning

+0

@PostureOfLearning Grazie per la tua osservazione, ma dovresti dare un'occhiata alla domanda .. il quesiton non riguarda il metodo di sostituzione che riguarda il Regex. l'uso del metodo viene copiato dalla domanda fornita da sé con regex utile. Gentilmente riprendi il tuo voto :) –

+2

Capisco la domanda e mi rendo conto che anche la domanda ha codice non valido. Tuttavia, accetto codice non valido in una domanda poiché stanno cercando di imparare, ma trovo che il codice errato in una risposta non è accettabile. È una risposta e dovrebbe funzionare. La tua risposta mi porta nella direzione sbagliata quando cerco di risolvere il mio problema. Detto questo, se vuoi cambiarlo sarò felice di riprendere il voto;) – PostureOfLearning

0
var text = "Hello there(hello#)"; 

var rgx = new Regex("[^a-zA-Z0-9]"); 

text = rgx.Replace(text, string.Empty); 
+1

Benvenuto su SO. Una piccola spiegazione rende sempre più preziosa la tua risposta.Su SO, le persone tendono a sapere perché, invece di come. ;) – ForceMagic

2

E come un'operazione di sostituzione come un metodo di estensione:

public static class StringExtensions 
{ 
    public static string ReplaceNonAlphanumeric(this string text, char replaceChar) 
    { 
     StringBuilder result = new StringBuilder(text.Length); 

     foreach(char c in text) 
     { 
      if(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9') 
       result.Append(c); 
      else 
       result.Append(replaceChar); 
     } 

     return result.ToString(); 
    } 
} 

e test:

[TestFixture] 
public sealed class StringExtensionsTests 
{ 
    [Test] 
    public void Test() 
    { 
     Assert.AreEqual("text_LaLa__lol________123______", "text LaLa (lol) á ñ $ 123 ٠١٢٣٤".ReplaceNonAlphanumeric('_')); 
    } 
} 
9

È possibile utilizzare Linq per filtrare i caratteri richiesti:

String source = "Hello there(hello#)"; 

    // "Hellotherehello" 
    String result = new String(source 
    .Where(ch => Char.IsLetterOrDigit(ch)) 
    .ToArray()); 

O

String result = String.Concat(source 
    .Where(ch => Char.IsLetterOrDigit(ch))); 

E modo da non avere bisogno di espressioni regolari.

+0

Grande aggiunta! Sarebbe interessante conoscere le prestazioni relative di questo alla soluzione Regex. Fuori dal cancello, si legge molto meglio. –

+1

Un test rapido in LinqPad suggerisce che c'è una differenza trascurabile tra questo e persino una soluzione Regex compilata. La leggibilità vince per me. –

Problemi correlati