2016-01-21 5 views
6

私は文字列を入力できるプログラムを持っています。しかし引用符の間にあるテキストを削除する必要があります。引用符間のテキストを削除する

例:

で:今日は非常に "良い" と暑い日です。

out:今日は非常に暑い日です。

 Console.WriteLine("Enter text: "); 
     text = Console.ReadLine(); 

     int letter; 
     string s = null; 
     string s2 = null; 
     for (s = 0; s < text.Length; letter++) 
     { 
      if (text[letter] != '"') 
      { 
       s = s + text[letter]; 
      } 
      else if (text[letter] == '"') 
      { 

       s2 = s2 + letter; 
       letter++; 
       (text[letter] != '"') 
       { 
        s2 = s2 + letter; 
        letter++; 
       } 
      } 
     } 

私は、コンソールへの引用符の間のテキストなしで文字列を作成する方法を知りません。 正規表現のような複雑なメソッドは使用できません。

+1

あなたが複数の引用符で囲まれた文字列を持つことができますもしそうなら、あなたはそれらをすべて削除したいん –

+4

場合。??これは宿題なので、答えをそのまま出力するのではなく、一般的なポインタで答えるのが最善です。 –

+0

私はこれが宿題だと思っていますので、基本的なやり方で実際にやりたければ、変数 'bool inside = false;引用符に遭遇したとき、それが偽書面であるときにそれを変更する文字列からのe、そうでないときは。 –

答えて

8

これはトリックを行う必要があります。文字列内のすべての文字を引用符でチェックします。 引用符が見つかった場合、フラグはtrueと設定されているため、それ以降の文字は無視されます。

別の引用符を検出すると、フラグをfalseに設定するので、文字のコピーが再開されます。

Console.WriteLine("Enter text: "); 
text = Console.ReadLine(); 

int letterIndex; 
string s2 = ""; 
bool quotesOpened = false; 
for (letterIndex= 0; letterIndex< text.Length; letterIndex++) 
{ 
    if (text[letterIndex] == '"') 
    { 
     quotesOpened = !quotesOpened; 

     s2 = s2 + text[letterIndex]; 
    } 
    else 
    { 
     if (!quotesOpened) 
      s2 = s2 + text[letterIndex]; 
    } 
} 

希望します。

+0

私はあなたのやり方で、とてもシンプルで、 。 – Jolek111

+2

あなたはこの方法で 'quotesOpened'の値を逆にしたブロックを書くことができました:' quotesOpened =!quotesOpened'。 – Aaron

+0

良いアイデア、レビュー受け入れました。 – GigiSan

6

Aは大丈夫、私はより良い好きな正規表現、なしで取る、しかし:

string input = "abc\"def\"ghi"; 
string output = input; 

int firstQuoteIndex = input.IndexOf("\""); 

if (firstQuoteIndex >= 0) 
{ 
    int secondQuoteIndex = input.IndexOf("\"", firstQuoteIndex + 1); 

    if (secondQuoteIndex >= 0) 
    { 
     output = input.Substring(0, firstQuoteIndex + 1) + input.Substring(secondQuoteIndex); 
    } 
} 

Console.WriteLine(output); 

それは何:

  • それはを探し次に"
  • の最初の出現を検索第2の出現は"
  • そして、それは最初の部分をとります。最初の部分は、ですと第2部分を含む第2部分"

文字列の最後まで検索してすべての文字列を置換することで、これを改善できます。検索しなければならない新しい「最初のインデックス」を覚えておく必要があります。

+0

私もこのコードを試してみて、それも働いています。ありがとうございます。 – Jolek111

1

これは、可能な解決策のようになります。

String cmd = "This is a \"Test\"."; 
// This is a "". 
String newCmd = cmd.Split('\"')[0] + "\"\"" + cmd.Split('\"')[2]; 
Console.WriteLine(newCmd); 
Console.Read(); 

あなたは単に「一緒に両方の部品を追加し、古い追加しと」をでテキストを分割します。非常に素晴らしい解決策ではありませんが、それはとにかく機能します。

€のDIT:

Console.WriteLine("Enter text: "); 
var text = Console.ReadLine(); 

var skipping = false; 

var result = string.Empty; 

foreach (var c in text) 
{ 
    if (!skipping || c == '"') result += c; 
    if (c == '"') skipping = !skipping; 
} 

Console.WriteLine(result); 

Console.ReadLine(); 

結果の文字列がある限り、我々は引用符の間ではありません元の文字列から文字を追加することによって作成された(使用した:

cmd[0] = "This is a " 
cmd[1] = "Test" 
cmd[2] = "." 
1

あなたはこのようにそれを行うことができますskipping変数)。

+1

コードブロックはちょうど正にソリューションにコピーして正しい結果が表示されているかどうかを確認する必要があります。OPの機能を拡張する必要がある場合は、さらに質問につながります。これは簡単な説明で回避できます。コメントはちょうどそれ、コメント、あなたがそれで好きなことをしています。私はあなたがFGITWをプレイしたいと思っているならば、ちょうど良いことを示唆していた。 – Sayse

3

まず、我々は文字列を分割して、奇妙な項目を削除する必要があります。

private static String Remove(String s) 
    { 
     var rs = s.Split(new[] { '"' }).ToList(); 
     return String.Join("\"\"", rs.Where(_ => rs.IndexOf(_) % 2 == 0)); 
    } 

    static void Main(string[] args) 
    { 
     var test = Remove("hello\"world\"\"yeah\" test \"fhfh\""); 
     return; 
    } 
+0

このsolutイオンはきちんとしていますが、出力に残す必要のある引用符も削除されます。 'out:今日はとても暑い日です。 ' – jvanrhyn

+0

はい、編集... –

+0

あなたの以前の解決策が良かったようです。いくつかの欠点を除いて。現在の解決策がなぜ 'String.Join(" "、input.Split( '"')よりも優れていますか?(パート、インデックス)=>インデックス%2!= 0? "" "":part)) ' ? – Kote

1

は引用符のすべてのインデックスを取るには、部分文字列を使用して、引用符の間のテキストを削除します。

static void Main(string[] args) 
    { 
     string text = @" Today is a very ""nice"" and hot day. Second sentense with ""text"" test"; 

     var foundIndexes = new List<int>(); 
     foundIndexes.Add(0); 
     for (int i = 0; i < text.Length; i++) 
     { 
      if (text[i] == '"') 
       foundIndexes.Add(i); 

     } 

     string result = ""; 

     for(int i =0; i<foundIndexes.Count; i+=2) 
     { 
      int length = 0; 

      if(i == foundIndexes.Count - 1) 
      { 
       length = text.Length - foundIndexes[i]; 
      } 
      else 
      { 
       length = foundIndexes[i + 1] - foundIndexes[i]+1; 
      } 
      result += text.Substring(foundIndexes[i], length); 

     } 

     Console.WriteLine(result); 
     Console.ReadKey(); 
    } 

出力:今日は "非常に" と暑い日です。 "" テスト "と第二sentense;

ここdotNetFiddle

2
string text = @" Today is a very ""nice"" and hot day. Second sentense with ""text"" test"; 
Regex r = new Regex("\"([^\"]*)\""); 
var a = r.Replace(text,string.Empty); 

これを試してみてください

関連する問題