2009-03-31 10 views
13

Ho un'app scritta in C# che esegue molte comparazioni di stringhe. Le stringhe vengono estratte da una varietà di fonti (incluso l'input dell'utente) e vengono quindi confrontate. Tuttavia sto incontrando problemi quando si confronta lo spazio '32' con lo spazio non-breaking '160'. Per l'utente hanno lo stesso aspetto e quindi si aspettano una corrispondenza. Ma quando l'app fa il confronto, non c'è corrispondenza.Confronto di stringhe, .NET e spazio di interruzione

Qual è il modo migliore per farlo? Dovrò andare a tutte le parti del codice che eseguono il confronto di una stringa e normalizzare manualmente spazi non distruttivi negli spazi? .NET offre qualcosa per aiutarti? (Ho provato tutte le opzioni di confronto ma nessuna sembra aiutare.)

È stato suggerito di normalizzare le stringhe al momento del ricevimento e quindi lasciare che il metodo di confronto stringa confronti semplicemente le stringhe normalizzate. Non sono sicuro che sarebbe semplice farlo perché ciò che è una stringa normalizzata in primo luogo. Cosa lo normalizzo anche io? Certo, per ora posso convertire spazi ininterrotti in spazi di rottura. Ma cos'altro può apparire? Possono esserci potenzialmente molte di queste regole? Potrebbero persino essere in conflitto. (In un caso voglio usare una regola e in un'altra non lo faccio.)

+0

È possibile modificare la propria domanda di aggiungere ulteriori informazioni o fornire chiarimenti. –

risposta

9

Se fosse per me, vorrei "normalizzare" le stringhe come "le ho tirate dentro"; probabilmente con una stringa.Replace(). Quindi non dovrai cambiare i tuoi confronti da nessun'altra parte.

Modifica: Mark, è difficile. Dipende solo da te, o dai tuoi clienti, da cosa sia una stringa 'normalizzata'. Sono stato in una situazione simile in cui il cliente richiedeva stringhe del tipo:

 
I have 4 apples. 
I have four apples. 

erano effettivamente uguali. Potresti aver bisogno di normalizzatori separati per diverse situazioni. Ad ogni modo, farei comunque la normalizzazione dopo aver recuperato le stringhe originali.

+0

Farei la faccenda. –

+0

Sì, normalizzerei le stringhe a ciò che ti interessa con la tua funzione che chiama stringa. Sostituisci e poi confronta. – NoahD

+0

ragazzi come faccio a postare una domanda di follow up o una domanda di chiarimento a questa proposta di risposta? Lo faccio qui? Questo consente solo 255 caratteri – Mark

29

Ho passato un sacco di dolore per trovare questa semplice risposta. Il codice seguente utilizza un'espressione regolare per sostituire gli spazi non interrompibili con spazi normali.

string cellText = "String with non breaking spaces."; 
cellText = Regex.Replace(cellText, @"\u00A0", " "); 

Spero che questo aiuti, Dan

+10

Non impedisce al carattere di fuga di funzionare? Non dovrebbe essere cellText.Replace ("\ u00A0", "")? – jpmcclung

+8

@jpmcclung si. Vedi "Oggetti Char e caratteri Unicode" in http://msdn.microsoft.com/en-us/library/system.string.aspx. FWIW, 'cellText.Sostituisci ('\ u00A0', '') 'è ancora più veloce (http://www.dotnetperls.com/replace-performance) – Arithmomaniac

+2

FYI - cellText.Replace (@" \ u00A0 "," ") non ha funzionato. Regex.Replace (cellText, @ "\ u00A0", ""); sembra essere la strada da percorrere. – gpmurthy

1

Io suggerirei di creare il proprio operatore di confronto di stringa che si estende uno dei più originali - fare la "normalizzazione" c'è (sostituire spazio unificatore con lo spazio regolare) . Oltre al metodo Equals, esiste un valore statico String.Equals che accetta un confronto.

0

lo stesso senza regex, soprattutto per me stesso quando ne ho bisogno più avanti:

text.Replace(' ', '\u00A0')