2016-01-21 17 views
6

Ho un programma, in cui è possibile inserire una stringa. Ma voglio che il testo tra virgolette "" sia rimosso.Rimuovi testo tra virgolette

Esempio:

in: Oggi è una "bella" e calda giornata.

out: Oggi è un giorno molto "" e caldo.

 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++; 
       } 
      } 
     } 

non so come scrivere la stringa di testo tra le virgolette, senza alla console. Non sono autorizzato a utilizzare un metodo complesso come regex.

+1

si può avere di più stringhe tra virgolette In caso affermativo, si desidera rimuovere tutte –

+4

Se.?? questo è compito a casa, è meglio rispondere con i puntatori generali piuttosto che fornire la risposta alla lettera ... –

+0

Suppongo che questo è compito a casa quindi se vuoi veramente farlo in un modo base, avere una variabile 'bool inside = false;' e cambiarlo quando si incontra un segno di virgolette, quando è falso e dalla stringa, quando non lo fanno. –

risposta

8

Questo dovrebbe fare il trucco. Controlla ogni carattere nella stringa per le virgolette. Se trova virgolette, imposta un flag quotesOpened come true, quindi ignorerà qualsiasi carattere successivo.

Quando incontra altre virgolette, imposta il flag su false, quindi riprenderà a copiare i caratteri.

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]; 
    } 
} 

Spero che questo aiuti!

+0

ho fatto a modo tuo, è molto semplice e funziona, grazie – Jolek111

+2

Si potrebbe scrivere il blocco inverso il valore di 'quotesOpened' in questo modo:' quotesOpened =! QuotesOpened'. – Aaron

+0

Buona idea, revisione accettata – GigiSan

6

A prendere senza le espressioni regolari, che mi piace di più, ma va bene:

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); 

Cosa fa:

  • Si cerca la prima occorrenza di "
  • Poi cerca la seconda occorrenza di "
  • Quindi la prima parte, incluso il primo " e la seconda parte, compreso il secondo "

si potrebbe migliorare da soli cercando fino alla fine della stringa e sostituire tutte le occorrenze. Devi ricordare il nuovo 'primo indice' su cui devi cercare.

+0

Provo anche questo codice e funziona anche, grazie – Jolek111

1

questa sarebbe una possibile soluzione:

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

È sufficiente dividere il testo in " e quindi aggiungere le due parti insieme e aggiungere il vecchio ". Non è una soluzione molto bella, ma funziona comunque.

€ dit:

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

si può fare in questo modo:

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(); 

La stringa risultato è stato creato con l'aggiunta di caratteri dalla stringa originale finché non siamo tra virgolette (utilizzando il skipping variabile).

+1

Non può essere una novità per te che i blocchi di codice sono spesso solo copiato in una soluzione per vedere se i risultati corretti sono visibili, il che porta a ulteriori domande lungo la linea quando OP devono estendere le funzionalità che potrebbero essere evitate con una semplice spiegazione che ho scommesso che avresti impiegato meno di 30 secondi per scrivere. Un commento è solo questo, un commento, fai quello che ti piace. Stavo solo suggerendo se vuoi giocare a FGITW, puoi anche farlo bene. – Sayse

3

In primo luogo abbiamo bisogno di dividere corda e poi rimuovere elementi dispari:

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

Questo solut ion è pulito, ma rimuove anche le virgolette che devono essere lasciate nell'output. 'out: Oggi è un giorno molto" "e caldo. ' – jvanrhyn

+0

sì, modifica ... –

+0

Sembra che la soluzione precedente sia buona. Tranne alcuni inconvenienti. Perché la soluzione corrente è migliore di 'String.Join (" ", input.Split ('"'). Select ((part, index) => index% 2! = 0? "\" \ "": Part)) ' ? – Kote

1

Prendere tutti gli indici di citazioni rimuovere il testo tra virgolette utilizzando stringa.

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(); 
    } 

uscita: Oggi è molto "" e giornata calda. Secondo sentense con "" test ";

Qui 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); 

Si prega di provare questo

Problemi correlati