2013-04-20 22 views
21

Sono abbastanza nuovo nell'usare le espressioni regolari e, in base ad alcuni tutorial che ho letto, non riesco a ottenere questo passaggio nel mio Regex.Replace formattato correttamente.Espressione regolare sostituisci in C#

Ecco lo scenario su cui sto lavorando ... Quando estraggo i miei dati dalla casella di riepilogo, desidero formattarlo in un formato simile a CSV e quindi salvare il file. L'utilizzo dell'opzione Sostituisci è la soluzione ideale per questo scenario?

Prima dell'esempio di formattazione di espressioni regolari.

FirstName LastName Salary Position 
------------------------------------- 
John  Smith $100,000.00 M 

formato proposto dopo un'espressione regolare sostituire

John Smith,100000,M 

corrente uscita di stato formattazione:

John,Smith,100000,M 

* Nota - c'è un modo posso sostituire la prima virgola con uno spazio bianco?

frammento del mio codice

using(var fs = new FileStream(filepath, FileMode.OpenOrCreate, FileAccess.Write)) 
{ 
    using(var sw = new StreamWriter(fs)) 
    { 
     foreach (string stw in listBox1.Items) 
     { 
      StringBuilder sb = new StringBuilder(); 
      sb.AppendLine(stw); 

      //Piecing the list back to the original format 
      sb_trim = Regex.Replace(stw, @"[$,]", ""); 
      sb_trim = Regex.Replace(sb_trim, @"[.][0-9]+", ""); 
      sb_trim = Regex.Replace(sb_trim, @"\s", ","); 
      sw.WriteLine(sb_trim); 
     } 
    } 
} 
+0

Con la vostra espressione regolare '44.66' sarebbe sostituito da' 44' – Anirudha

+0

appena ri-pubblicato la mia dichiarazione ... Sto convertendo 100.000,00 a 100000.Sì, sto lasciando i centesimi fuori da questa equazione quando sto scrivendo di nuovo al formato CSV. – Curtis

+0

Si prega di provare a non usare tanti font in grassetto - Ho rimosso tutti e anche corretto le chiamate di Smock incomplete, quindi il codice sembra ok. –

risposta

30

Si può fare di

//let stw be "John Smith $100,000.00 M" 

sb_trim = Regex.Replace(stw, @"\s+\$|\s+(?=\w+$)", ","); 
//sb_trim becomes "John Smith,100,000.00,M" 

sb_trim = Regex.Replace(sb_trim, @"(?<=\d),(?=\d)|[.]0+(?=,)", ""); 
//sb_trim becomes "John Smith,100000,M" 

sw.WriteLine(sb_trim); 
+0

Funziona, grazie Anirudh! – Curtis

+0

Questo fa davvero un sacco di lavoro non necessario, e probabilmente non è ottimo per le prestazioni. Se hai intenzione di farlo, imposta almeno un timeout. – Zenexer

+0

@Zenexer vuole sostituire ',', '.000's' in stipendio .. – Anirudha

3

aggiungere le seguenti 2 linee

var regex = new Regex(Regex.Escape(",")); 
sb_trim = regex.Replace(sb_trim, " ", 1); 

Se sb_trim = John, Smith è questo con due sostituire, 100000, M il codice sopra restituirà "John Smith, 100000, M"

14

Prova questo ::

sb_trim = Regex.Replace(stw, @"(\D+)\s+\$([\d,]+)\.\d+\s+(.)", 
    m => string.Format(
     "{0},{1},{2}", 
     m.Groups[1].Value, 
     m.Groups[2].Value.Replace(",", string.Empty), 
     m.Groups[3].Value)); 

Questo è quanto di pulito una risposta, come si arriva, almeno con regex.

  • (\D+): Primo gruppo di acquisizione. Uno o più caratteri non numerici.
  • \s+\$: uno o più caratteri di spaziatura, quindi un segno di dollaro letterale ($).
  • ([\d,]+): secondo gruppo di acquisizione. Uno o più cifre e/o virgole.
  • \.\d+: punto decimale, quindi almeno una cifra.
  • \s+: uno o più caratteri di spaziatura.
  • (.): terzo gruppo di acquisizione. Qualsiasi carattere non lineare.

Il secondo gruppo di acquisizione deve inoltre avere le virgole spogliate. Potresti farlo con un'altra regex, ma è davvero inutile e dannosa per le prestazioni. Questo è il motivo per cui abbiamo bisogno di usare un'espressione lambda e un formato stringa per mettere insieme la sostituzione. Se non fosse per questo, si potrebbe utilizzare questo come la sostituzione, in luogo dell'espressione lambda:

"$1,$2,$3" 
+0

Grazie, sì ho tentato di raggruppare le mie espressioni regolari, tuttavia mi sembrava di complicare il mio scenario più di ogni altra cosa, quindi sono tornato alle basi. Darò anche a questo un colpo. – Curtis

+0

Probabilmente c'è un modo per evitare le virgole nel gruppo, ma mi sfugge. Ci sono sicuramente persone qui che hanno più familiarità con espressioni rege specifiche di .NET, quindi forse lo sapranno. – Zenexer

+0

Ho aggiunto una versione molto migliore, supponendo che funzioni. Una linea. – Zenexer