2009-03-31 9 views
13

Ich habe eine App in C# geschrieben, die eine Menge String Vergleich macht. Die Strings werden aus einer Vielzahl von Quellen (einschließlich Benutzereingaben) eingezogen und dann verglichen. Allerdings habe ich Probleme beim Vergleich von Speicherplatz '32' mit dem nicht-brechenden Speicherplatz '160'. Für den Benutzer sehen sie gleich aus und sie erwarten eine Übereinstimmung. Aber wenn die App den Vergleich durchführt, gibt es keine Übereinstimmung.String-Vergleich, .NET und nicht brechende Leerzeichen

Was ist der beste Weg, um darüber zu gehen? Muss ich zu allen Teilen des Codes gehen, die einen String vergleichen und nicht-brechende Leerzeichen manuell in Leerzeichen normalisieren? Bietet .NET etwas, um damit zu helfen? (Ich habe alle Vergleichsoptionen ausprobiert, aber keine scheint zu helfen.)

Es wurde vorgeschlagen, dass ich die Strings beim Empfang normalisiere und dann die String-Vergleichsmethode einfach die normalisierten Strings vergleichen lasse. Ich bin mir nicht sicher, ob es einfach wäre, das zu tun, denn was ist eine normalisierte Zeichenkette überhaupt? Was normalisiere ich auch? Sicher, jetzt kann ich nichtbrechende Räume in brechende Räume umwandeln. Aber was kann sonst noch auftauchen? Kann es sehr viele dieser Regeln geben? Könnten sie sogar widersprüchlich sein? (In einem Fall möchte ich eine Regel verwenden und in einem anderen nicht.)

+0

Sie Ihre eigene Frage bearbeiten können weitere Informationen oder zur Klarstellung hinzuzufügen. –

Antwort

9

Wenn ich es wäre, würde ich die Saiten "normalisieren", wie ich sie "eingezogen" habe; wahrscheinlich mit einem string.Replace(). Dann müssen Sie Ihre Vergleiche nirgendwo anders ändern.

Bearbeiten: Mark, das ist eine schwierige Frage. Es liegt wirklich an Ihnen oder Ihren Kunden, was eine "normalisierte" Zeichenkette ist. Ich war in einer ähnlichen Situation, in der der Kunde verlangte, dass Strings wie:

tatsächlich gleich waren. Sie benötigen möglicherweise separate Normalizer für verschiedene Situationen. Wie auch immer, ich würde immer noch die Normalisierung beim Abrufen der ursprünglichen Saiten vornehmen.

+0

Ich würde das Smame tun. –

+0

Ja, ich würde die Zeichenfolgen auf das, was Ihnen wichtig ist, mit Ihrer eigenen Funktion, die string aufruft, normalisieren. Ersetzen und dann den Vergleich. – NoahD

+0

jungs Wie stelle ich eine Follow-up-Frage oder eine Klärungsfrage zu dieser vorgeschlagenen Antwort? Tue ich es hier? Dies erlaubt nur 255 Zeichen. – Mark

29

Ich ging durch viele Schmerzen, um diese einfache Antwort zu finden. Der folgende Code verwendet einen regulären Ausdruck, um nicht brechende Leerzeichen durch normale Leerzeichen zu ersetzen.

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

hoffte, das hilft, Dan

+10

Stoppt das @ das Escape-Zeichen nicht? Sollte es nicht CellText.Replace ("\ u00A0", "") sein? – jpmcclung

+8

@jpmccung ja. Siehe "Zeichenobjekte und Unicode-Zeichen" in http://msdn.microsoft.com/en-us/library/system.string.aspx. FWIW, 'zelleText.Ersetzen ('\ u00A0', '') 'ist noch schneller (http://www.dotnetperls.com/replace-performance) – Arithmomaniac

+2

FYI - cellText.Replace (@" \ u00A0 "," ") hat nicht funktioniert. Regex.Replace (cellText, @ "\ u00A0", ""); scheint der richtige Weg zu sein. – gpmurthy

1

Ich würde vorschlagen, Ihre eigene Zeichenfolge comparer schaffen, die eine der ursprünglichen erstreckt - tun, um die „Normalisierung“ dort (ersetzen non-breaking Raum mit regelmäßigem Raum) . Zusätzlich zu der Instanz Equals Methode gibt es eine statische String.Equals, die einen Vergleicher nimmt.

0

Dasselbe ohne regex, vor allem für mich, wenn ich es brauche später:

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