2009-03-31 8 views
13

私はC#で書かれたアプリを持っていて、多くの文字列を比較します。文字列はさまざまなソース(ユーザー入力を含む)から取り込まれ、次に比較されます。しかし、私はスペース '32'と非破壊スペース '160'を比較するときに問題にぶち当たっています。ユーザーには同じように見えるため、マッチが期待されます。しかし、アプリが比較を行うときには、一致がありません。文字列の比較、.NETと非改行のスペース

これについてはどのような方法が最適ですか?私は文字列を比較するコードのすべての部分に行き、非改行スペースを手動でスペースに正規化する必要がありますか? .NETはこれを支援する何かを提供していますか? (私はすべての比較オプションを試しましたが、どれも役に立たないようです)

私は受信時に文字列を正規化して、文字列比較メソッドで単純に正規化文字列を比較させることが推奨されています。私は最初に正規化された文字列があるので、それを行うのは簡単ではないでしょうか。私はそれを何とか正規化しますか?確かに、私は非破壊空間を破壊空間に変換することができます。しかし、他に何が現れますか?潜在的にこれらのルールが非常に多くある可能性がありますか?彼らは矛盾しているかもしれない。 (あるケースでは、ルールを使用したい、別のルールでは使用しません)

+0

あなたはより多くの情報を追加または説明を提供するために、独自の質問を編集することができます。 –

答えて

9

私がいた場合、私はそれらを引っ張って '正規化'します。おそらくstring.Replace()を使用します。次に、他の場所で比較を変更する必要はありません。

を編集してください。マークするのは難しいです。本当にあなた、またはあなたのクライアントに、「正規化された」文字列は何ですか?私は顧客が次のような文字列を要求した同様の状況にいます:

 
I have 4 apples. 
I have four apples. 

実際には等しいです。異なる状況に対して別々のノーマライザーが必要な場合があります。いずれにせよ、私は元の文字列の検索時にはまだ正規化を行います。

+0

私はスマムをします。 –

+0

ええと、string.Replaceを呼び出して比較を行う独自の関数で気にするものに正規化します。 – NoahD

+0

みんなどのようにこの提案された答えにフォローアップの質問や明確化の質問を投稿するのですか?私はここでそれをしますか?これは255文字しか許可しません。 – Mark

29

私はこの単純な答えを見つけるために多くの痛みを経験しました。以下のコードでは、正規表現を使用して、改行しないスペースを通常のスペースに置き換えます。このことができます

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

希望、ダン

私はオリジナルのものの一つを拡張し、独自の文字列の比較子を作成することをお勧めしたい
+10

@はエスケープ文字の動作を停止しませんか? cellText.Replace( "\ u00A0"、 "")であってはいけませんか? – jpmcclung

+8

@jpmcclungはい。 http://msdn.microsoft.com/en-us/library/system.string.aspxの「文字オブジェクトとUnicode文字」を参照してください。 FWIW、 'cellText。 – Arithmomaniac

+2

FYI - cellText.Replace(@ "\ u00A0"、 "")は機能しませんでした。 Regex.Replace(cellText、@ "\ u00A0"、 "");行く道があるようだ。 – gpmurthy

1

- そこに「正常化」を行います(通常のスペースと改行なしスペースを置き換えます) 。インスタンスEqualsメソッドに加えて、スタンプString.Equalsがあり、これには比較機能があります。主に自分のために正規表現せずに

0

同じ、私は後でそれを必要とする:

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