2016-04-04 32 views
1

私はこれに類似する多くの参照を見つけましたが、まったく同じものはありませんので、誰かが助けてくれることを願っています。
簡単に言えば、ユーザーが入力した文字列をWinform入力に入力し、最初に空白を取り除き、「違法」文字のリストをイギリスの通貨記号(£)に置き換えます。要件は入力の使用ですが、プロセスによって生成されるファイルには変更されたファイル名があります。c#文字列内の文字選択の各インスタンスを置き換えます。

私のコードでは、私は二回呼んでいる
public static class ExtensionMethods 
    { 
     public static string Replace(this string s, char[] separators, string newVal) 
     { 
      var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); 
      return String.Join(newVal, temp); 
     } 
    } 

public static string RemoveUnwantedChars(string enteredName, char[] unwanted, string rChar) 
    { 
     return enteredName.Replace(unwanted, rChar); 
    } 

char[] blank = { ' ' }; 
string ename = Utilities.RemoveUnwantedChars(this.txtTableName.Text, blank, string.Empty); 

char[] unwanted = { '(', ')', '.', '%', '/', '&', '+' }; 
string fname = Utilities.RemoveUnwantedChars(ename, unwanted, "£"); 

私が入力した場合、私は(拡張メソッドに基づく)関数を書きましたが、予想ほど働いていない
(GH)F16.5%MX/Y & 1 + 1 ")など、少なくとも1つの空白文字を含む文字列の場合、次の結果が得られます。
ename =" (GH)F16.5%MX/Y & 1 + 1 " - これは、空白。
fname = "GH£F16£5£MX££Y£1£1" - これは最初の文字を置き換えずに削除した点で正しく機能しませんでした。
残りの文字は正しく置き換えられました。私の文字列が "G(H)F16.5%MX/Y & 1 + 1"だった場合にのみ、「違法」文字の1つが文字列の先頭にある場合にのみ発生します。 F16£5£MX£££1£1 "となります。また、複数の「違法」文字を1つの「£」で置き換えるので、「M()GX + 1」は「M£GX£1」になりますが、「M££GX£1」になります。

答えて

3

私の問題はあなたの交換用拡張機能にあると思います。この行で分割しています

var temp = s.Split(separators, StringSplitOptions.RemoveEmptyEntries); 

予期しない結果を引き起こす空のエントリを削除しています。代わりにこれを使用します。

var temp = s.Split(separators, StringSplitOptions.None); 
+0

https://dotnetfiddle.net/qjrgcc – alextansc

0

あなたに分割方法を使用するときは、以下の文字列を取得機能を置き換えます GH、F16、5、MX、Y、1、1 はあなたが得るあなたnewValにしてそれらを結合する場合: GH + newVal + F16 + newVal + ...したがって、最初に置換された文字は省略されます。

最初のcharが "違法"であるかどうかをチェックし、文字列の先頭にnewValを入れる必要があるでしょう。

2

string.Join()は区切り文字をの間に置くので、問題が発生しています。部分文字列の間には置かれません。

一つの可能​​な解決策はstring.Join()の使用を避け、代わりにこのようReplace()を書くことです:

public static class ExtensionMethods 
{ 
    public static string Replace(this string s, char[] separators, string newVal) 
    { 
     var sb = new StringBuilder(s); 

     foreach (char ch in separators) 
     { 
      string target = new string(ch, 1); 
      sb.Replace(target, newVal); 
     } 

     return sb.ToString(); 
    } 
}